Jak zaokrouhlit prvky v matici v Octave:
Existuje mnoho různých způsobů, jak zaokrouhlit matici a zaokrouhlit číslo v oktávě.
Možnost 1, použití funkce formátu 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
Výstup , poznamenejte si token "% 5.2f". 'f' znamená očekávat plovoucí, 5 znamená zabírat 5 míst. 2 znamená přesnost 2 jednotek za desetinnou čárkou.
ans = 100.12
ans = 3.12
ans = 2.12
ans = 4.12
Možnost 2, zaokrouhlit na platné číslice pomocí eval a mat2str
mymatrix2=[100.1234567, 2.12345; 3.1234567891, 4.1234];
j = mat2str(mymatrix2, 3);
mymatrix2=eval(j)
Výstup , matice zaokrouhlena na 3 platné číslice, upozornění 100,123 zaokrouhleno na 100, zatímco 2,12345 bylo zaokrouhleno na 2,12
mymatrix2 = 100.0000 2.1200
3.1200 4.1200
Možnost 3, použijte funkci zaokrouhlení
Funkce round nemá v Octave parametr přesnosti. Můžete to však obejít tak, že každou položku v matici vynásobíte 100, zaokrouhlíte ji na nejbližší int a každou položku vydělíte 100:
mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
round(mymatrix .* 100) ./ 100
Výstup , kolo proběhne správně:
ans = 100.1200 2.1200
3.1200 4.1200
Možnost 4, zadejte output_precision(num)
Všimli jste si, že výše uvedená možnost 3 ponechala koncové nuly, což může být nežádoucí, takže jim můžete říci, aby zmizely nastavením output_precision:
mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
output_precision(3)
disp(mymatrix)
Výstup :
100.1235 2.1235
3.1235 4.1234
100.123 2.123
3.123 4.123
Octave má při pokusu o zaokrouhlování nějaké zvláštní chování, protože se octave usilovně snaží jednotně aplikovat jednotné zaokrouhlení na všechny položky v matici. Takže pokud máte více sloupců s velmi odlišnými hodnotami, octave uvidí malou hodnotu a řekne:"Měl bych to převést na exponenciální hodnotu jako 1.0e-04
, a tak je stejná exponenciála aplikována na celou datovou strukturu v matici.
pro ty, kteří chtějí, aby to fungovalo, aniž by se hluboce probírali diskusí, proč to tak je (konkrétně oktáva round
stále nepodporuje druhý argument definující přesnost).
ŘEŠENÍ :
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