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