GNU/Linux >> Tutoriales Linux >  >> Linux

GNU Octave, redondea un número a unidades de precisión

Cómo redondear elementos en una matriz en Octave:

Hay muchas formas diferentes de redondear una matriz y redondear un número en octavas.

Opción 1, uso de la función de formato sprintf

mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
rows = rows(mymatrix);
cols = columns(mymatrix);
for i = 1:rows
  for j = 1:cols
    sprintf("%5.2f", mymatrix(j,i))
  endfor
endfor

Salida , tenga en cuenta el token "%5.2f". La 'f' significa esperar un flotante, el 5 significa ocupar 5 espacios. El 2 significa 2 unidades de precisión después del punto decimal.

ans = 100.12
ans =   3.12
ans =   2.12
ans =   4.12

Opción 2, redondear a dígitos significativos usando eval y mat2str

mymatrix2=[100.1234567, 2.12345; 3.1234567891, 4.1234];
j = mat2str(mymatrix2, 3);
mymatrix2=eval(j)

Salida , matriz redondeada a 3 dígitos significativos, observe 100.123 redondeada a 100 mientras que 2.12345 fue redondeada a 2.12

mymatrix2 = 100.0000     2.1200
              3.1200     4.1200

Opción 3, usa la función de ronda

La función de ronda no tiene un parámetro de precisión en Octave. Sin embargo, puede solucionarlo multiplicando cada elemento de la matriz por 100, redondeándolo al int más cercano y luego dividiendo cada elemento por 100:

mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
round(mymatrix .* 100) ./ 100

Salida , la ronda ocurre correctamente:

ans = 100.1200     2.1200
        3.1200     4.1200

Opción 4, especifique un output_precision(num)

Notaste que la opción 3 anterior mantuvo los ceros finales, lo que puede ser indeseable, por lo que puedes decirles que desaparezcan configurando output_precision:

mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
output_precision(3)
disp(mymatrix)

Salida :

100.1235     2.1235
  3.1235     4.1234

100.123     2.123
  3.123     4.123

Octave tiene un comportamiento extraño cuando intenta redondear porque octave se esfuerza por aplicar uniformemente un redondeo uniforme a todos los elementos de una matriz. Entonces, si tiene varias columnas con valores muy diferentes, octave ve un valor pequeño y dice:"Debería convertirlo en un exponencial como 1.0e-04 , por lo que se aplica la misma exponencial a toda la estructura de datos de la matriz.


para aquellos que quieren que funcione sin profundizar en la discusión de por qué las cosas son así (es decir, octava round todavía no admite un segundo argumento que defina la precisión).

SOLUCIÓN ALTERNATIVA :

a = [0.056787654, 0.0554464; 0.056787654, 0.0554464];
a
round_digit = 2;
if exist('OCTAVE_VERSION', 'builtin') ~= 0;
     a = a.*(10^(round_digit));
     if (a >= 0) a = floor(a); else a = ceil(a); endif;
     a = a.*(10^(-round_digit));
else
     a = round(a, round_digit);
end
a

Linux
  1. Una breve introducción a las unidades de camino

  2. Instalar GNU Octave en Ubuntu 20.04 LTS - ¿Guía paso a paso?

  3. ¿Número de líneas emitidas por Ls?

  4. ¿Incrementar el número de compilación en Bash?

  5. Clasificación GNU por distinción entre mayúsculas y minúsculas

Expresión de secuencia Bash (rango)

Bash Select (hacer menús)

Instalación y uso del software científico GNU Octave en Ubuntu 15.04

Cómo instalar GNU Octave en Ubuntu

Cómo instalar GNU Octave en Ubuntu 18.04 LTS

Cómo instalar GNU Octave en Ubuntu 20.04