Come arrotondare gli elementi in una matrice in Octave:
Esistono molti modi diversi per arrotondare una matrice e arrotondare un numero in ottava.
Opzione 1, utilizzo della funzionalità del 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
Uscita , notare il token "%5.2f". La 'f' significa aspettarsi un float, il 5 significa occupare 5 spazi. Il 2 indica la precisione di 2 unità dopo la virgola.
ans = 100.12
ans = 3.12
ans = 2.12
ans = 4.12
Opzione 2, arrotonda alle cifre significative utilizzando eval e mat2str
mymatrix2=[100.1234567, 2.12345; 3.1234567891, 4.1234];
j = mat2str(mymatrix2, 3);
mymatrix2=eval(j)
Uscita , matrice arrotondata a 3 cifre significative, si noti 100.123 arrotondato a 100 mentre 2.12345 è stato arrotondato a 2.12
mymatrix2 = 100.0000 2.1200
3.1200 4.1200
Opzione 3, utilizza la funzione round
La funzione round non ha un parametro di precisione in Octave. Tuttavia puoi aggirarlo moltiplicando ogni elemento nella matrice per 100, arrotondandolo all'int più vicino, quindi dividendo ogni elemento per 100:
mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
round(mymatrix .* 100) ./ 100
Uscita , l'arrotondamento avviene correttamente:
ans = 100.1200 2.1200
3.1200 4.1200
Opzione 4, specifica un output_precision(num)
Hai notato che l'opzione 3 sopra ha mantenuto gli zeri finali, il che potrebbe essere indesiderabile, quindi puoi dire loro di andare via impostando output_precision:
mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
output_precision(3)
disp(mymatrix)
Uscita :
100.1235 2.1235
3.1235 4.1234
100.123 2.123
3.123 4.123
Octave ha un comportamento strano quando si tenta di eseguire l'arrotondamento perché l'ottava si sforza di applicare uniformemente un arrotondamento uniforme a tutti gli elementi in una matrice. Quindi, se hai più colonne con valori molto diversi, octave vede un valore minuscolo e dice:"Dovrei convertirlo in un esponenziale come 1.0e-04
, quindi lo stesso esponenziale viene applicato all'intera struttura dati nella matrice.
per coloro che vogliono farlo funzionare senza scavare a fondo nella discussione sul perché le cose stanno così (vale a dire l'ottava round
ancora non supporta un secondo argomento che definisce la precisione).
SOLUZIONE 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