GNU/Linux >> Tutoriels Linux >  >> Linux

GNU Octave, arrondir un nombre à des unités de précision

Comment arrondir les éléments d'une matrice dans Octave :

Il existe de nombreuses façons d'arrondir une matrice et d'arrondir un nombre en octave.

Option 1, utilisation de la fonctionnalité de format 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

Sortie , notez le jeton "%5.2f". Le 'f' signifie s'attendre à un flotteur, les 5 signifient occuper 5 espaces. Le 2 signifie une précision de 2 unités après la virgule.

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

Option 2, arrondir aux chiffres significatifs en utilisant eval et mat2str

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

Sortie , matrice arrondie à 3 chiffres significatifs, notez 100.123 arrondi à 100 alors que le 2.12345 a été arrondi à 2.12

mymatrix2 = 100.0000     2.1200
              3.1200     4.1200

Option 3, utilisez la fonction d'arrondi

La fonction round n'a pas de paramètre de précision dans Octave. Cependant, vous pouvez le contourner en multipliant chaque élément de la matrice par 100, en l'arrondissant à l'entier le plus proche, puis en divisant chaque élément par 100 :

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

Sortie , le tour se produit correctement :

ans = 100.1200     2.1200
        3.1200     4.1200

Option 4, spécifiez un output_precision(num)

Vous avez remarqué que l'option 3 ci-dessus conservait les zéros à droite, ce qui peut être indésirable, vous pouvez donc leur dire de disparaître en définissant output_precision :

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

Sortie :

100.1235     2.1235
  3.1235     4.1234

100.123     2.123
  3.123     4.123

Octave a un comportement étrange lorsqu'il essaie d'arrondir car octave s'efforce d'appliquer uniformément un arrondi uniforme à tous les éléments d'une matrice. Donc, si vous avez plusieurs colonnes avec des valeurs très différentes, octave voit une petite valeur et dit :"Je devrais la convertir en une exponentielle comme 1.0e-04 , et donc la même exponentielle est appliquée à toute la structure de données dans la matrice.


pour ceux qui veulent le faire fonctionner sans approfondir la discussion pourquoi les choses sont ainsi (à savoir l'octave round ne prend toujours pas en charge un deuxième argument définissant la précision).

SOLUTION :

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. Introduction aux outils automatiques GNU

  2. Une introduction aux utilitaires GNU Core

  3. Arrondir un nombre divisé en Bash

  4. Tri GNU sensible à la casse

  5. Dans quelles unités sont les mesures d'E/S en temps GNU ?

Expression de séquence bash (plage)

Bash Select (créer des menus)

Installation et utilisation du logiciel scientifique GNU Octave sur Ubuntu 15.04

Comment installer GNU Octave sur Ubuntu

Comment installer GNU Octave dans Ubuntu 18.04 LTS

Comment installer GNU Octave sur Ubuntu 20.04