Octave で行列の要素を四捨五入する方法:
行列を丸めたり、数値をオクターブで丸めたりするには、さまざまな方法があります。
オプション 1、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
出力 、「%5.2f」トークンに注意してください。 「f」はフロートを期待することを意味し、5 は 5 つのスペースを占有することを意味します。 2 は、小数点以下 2 単位の精度を意味します。
ans = 100.12
ans = 3.12
ans = 2.12
ans = 4.12
オプション 2、eval と mat2str を使用して有効数字に丸める
mymatrix2=[100.1234567, 2.12345; 3.1234567891, 4.1234];
j = mat2str(mymatrix2, 3);
mymatrix2=eval(j)
出力 、行列は有効数字 3 桁に丸められます。100.123 は 100 に丸められ、2.12345 は 2.12 に丸められます
mymatrix2 = 100.0000 2.1200
3.1200 4.1200
オプション 3、ラウンド関数を使用
ラウンド関数には、Octave の精度パラメーターがありません。ただし、マトリックス内の各項目に 100 を掛け、最も近い整数に丸め、各項目を 100 で割ることでハックできます。
mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
round(mymatrix .* 100) ./ 100
出力 、ラウンドは正しく行われます:
ans = 100.1200 2.1200
3.1200 4.1200
オプション 4、output_precision(num) を指定
上記のオプション 3 が末尾のゼロを保持していることに気付きましたが、これは望ましくない可能性があるため、output_precision を設定することでゼロを削除するように指示できます:
mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
output_precision(3)
disp(mymatrix)
出力 :
100.1235 2.1235
3.1235 4.1234
100.123 2.123
3.123 4.123
Octave は、行列内のすべての項目に均一な丸めを適用しようとするため、丸めを実行しようとすると奇妙な動作をします。したがって、値が大きく異なる複数の列がある場合、オクターブは小さな値を見て、「それを 1.0e-04
のような指数に変換する必要があります」と言います。 であるため、マトリックス内のデータ構造全体に同じ指数が適用されます。
なぜこのようになっているのかという議論を深く掘り下げずにそれを機能させたい人向け (つまり、オクターブ round
精度を定義する 2 番目の引数はまだサポートされていません)。
回避策 :
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