GNU/Linux >> Znalost Linux >  >> Linux

GNU Octave, zaokrouhlete číslo na jednotky přesnosti

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

Linux
  1. Krátký úvod k jednotkám cest

  2. Zvýšit číslo sestavení v Bash?

  3. Zaokrouhlete dělené číslo v bash

  1. bc zkrátit číslo s pohyblivou řádovou čárkou

  2. Počítá GNU/Linux procesy a vlákna dohromady, když omezím jejich počet?

  3. V jakých jednotkách jsou I/O míry v čase GNU?

  1. Úvod do GNU Autotools

  2. Úvod do GNU Core Utilities

  3. Nainstalovat GNU Octave na Ubuntu 20.04 LTS – průvodce krok za krokem?