GNU/Linux >> Linux Esercitazione >  >> Linux

GNU Octave, arrotonda un numero alla precisione delle unità

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

Linux
  1. Un'introduzione alle GNU Core Utilities

  2. Installa GNU Octave su Ubuntu 20.04 LTS - Guida passo passo?

  3. bc tronca il numero in virgola mobile

  4. GNU ordina per distinzione tra maiuscole e minuscole

  5. In quali unità sono le misure I/O nel tempo GNU?

Espressione sequenza Bash (intervallo)

Bash Select (Crea menu)

Installazione e utilizzo del software scientifico GNU Octave su Ubuntu 15.04

Come installare GNU Octave su Ubuntu

Come installare GNU Octave in Ubuntu 18.04 LTS

Come installare GNU Octave su Ubuntu 20.04