Saltar al contenido

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

Luego de de una extensa búsqueda de información dimos con la respuesta esta duda que suelen tener algunos los lectores. Te ofrecemos la respuesta y nuestro deseo es serte de gran ayuda.

Solució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

Producción, 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)

Producciónmatriz redondeada a 3 dígitos significativos, observe 100.123 redondeado a 100 mientras que el 2.12345 fue redondeado 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 modificarlo 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

Producciónla 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)

Producción:

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 convertir eso en un exponencial como 1.0e-04por 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 ALTERNA:

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

Si posees alguna perplejidad y disposición de afinar nuestro artículo puedes dejar un exégesis y con placer lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *