GNU/Linux >> LINUX-Kenntnisse >  >> Linux

GNU Octave, rundet eine Zahl auf Einheitengenauigkeit

Wie man Elemente in einer Matrix in Octave rundet:

Es gibt viele verschiedene Möglichkeiten, eine Matrix zu runden und eine Zahl in Oktaven zu runden.

Option 1, Verwendung der sprintf-Formatfunktion

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

Ausgabe , beachten Sie das Token „%5.2f“. Das 'f' bedeutet, dass ein Schwimmer erwartet wird, die 5 bedeutet, dass 5 Felder belegt sind. Die 2 bedeutet 2 Einheiten Genauigkeit nach dem Komma.

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

Option 2, mit eval und mat2str auf signifikante Stellen runden

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

Ausgabe , Matrix auf 3 signifikante Stellen gerundet, beachten Sie, dass 100,123 auf 100 gerundet wurde, während 2,12345 auf 2,12 gerundet wurde

mymatrix2 = 100.0000     2.1200
              3.1200     4.1200

Option 3, verwenden Sie die Rundungsfunktion

Die Round-Funktion hat keinen Genauigkeitsparameter in Octave. Sie können es jedoch umgehen, indem Sie jedes Element in der Matrix mit 100 multiplizieren, auf die nächste Ganzzahl runden und dann jedes Element durch 100 dividieren:

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

Ausgabe , Rundung tritt korrekt auf:

ans = 100.1200     2.1200
        3.1200     4.1200

Option 4, geben Sie eine output_precision(num) an

Sie haben bemerkt, dass Option 3 oben die nachgestellten Nullen beibehalten hat, was unerwünscht sein kann, also können Sie sie anweisen, zu verschwinden, indem Sie output_precision:

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

Ausgabe :

100.1235     2.1235
  3.1235     4.1234

100.123     2.123
  3.123     4.123

Octave hat ein seltsames Verhalten, wenn versucht wird, eine Rundung durchzuführen, da Octave sich bemüht, eine einheitliche Rundung auf alle Elemente in einer Matrix anzuwenden. Wenn Sie also mehrere Spalten mit sehr unterschiedlichen Werten haben, sieht octave einen winzigen Wert und sagt:„Ich sollte das in einen Exponentialwert wie 1.0e-04 umwandeln , und somit wird dieselbe Exponentialfunktion auf die gesamte Datenstruktur in der Matrix angewendet.


für diejenigen, die es zum Laufen bringen wollen, ohne sich tief in die Diskussion zu vertiefen, warum die Dinge so sind (nämlich Oktave round unterstützt immer noch kein zweites Argument, das die Genauigkeit definiert).

LÖSUNG :

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. GNU Octave auf Ubuntu 20.04 LTS installieren – Schritt-für-Schritt-Anleitung?

  2. Anzahl der von Ls ausgegebenen Zeilen?

  3. Build-Nummer in Bash erhöhen?

  4. Runden Sie eine geteilte Zahl in Bash

  5. Was ist ?=im Makefile

Bash-Sequenzausdruck (Bereich)

Bash Select (Menüs erstellen)

Installieren und Verwenden der wissenschaftlichen Software GNU Octave unter Ubuntu 15.04

So installieren Sie GNU Octave auf Ubuntu

So installieren Sie GNU Octave in Ubuntu 18.04 LTS

So installieren Sie GNU Octave auf Ubuntu 20.04