GNU/Linux >> Linux の 問題 >  >> Linux

GNU Octave、数値を単位精度に丸める

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

Linux
  1. GNUコアユーティリティの紹介

  2. 大文字と小文字を区別する GNU ソート

  3. GNU 時間の I/O 測定単位は何ですか?

  1. GNUAutotoolsの紹介

  2. パスユニットの簡単な紹介

  3. Ubuntu 20.04LTSにGNUOctaveをインストールします-ステップバイステップガイド?

  1. Lsによって出力される行数?

  2. Bashでビルド番号を増やしますか?

  3. Bashで割った数を四捨五入する