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:
setzenmymatrix=[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