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