GNU Octaveバージョン3.4.3では、このような行列の内容で行列を2単位の精度に丸めたいと思います。
mymatrix=[1.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
これは印刷します:
1.1235 2.1235
3.1235 4.1234
ご覧のとおり、dispは精度を「5」に強制します。単位の精度を2にします。これを行うにはどうすればよいですか。
行列を丸めたり、数値をオクターブで丸めたりするには、さまざまな方法があります。
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
Output、「%5.2f」トークンに注意してください。「f」はフロートを期待することを意味し、5 は 5 つのスペースを占有することを意味します。2 は、小数点以下 2 単位の精度を意味します。
ans = 100.12
ans = 3.12
ans = 2.12
ans = 4.12
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
ラウンド関数には、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
上記のオプション 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
次の GNU Octave 関数が非常に便利であることがわかりました。これにより、MxN 行列の個々の列ごとにカスタムの丸めを指定できます。
この関数を display_rounded_matrix.m というファイルに入れます。
function display_rounded_matrix(matrix, precision, outputFile)
%precision can be a single number, applied to all, or a
%matrix of values to be applied to the columns.
space_between_columns = "";
format_part = "%10.";
precision_format = cell(columns(precision), 1);
for i = 1:columns(precision),
precision_format{i,1} = strcat(format_part, num2str(precision(1,i)), "f");
end
if (nargin == 3 && outputFile != 0)
if (rows(precision) == 1 && columns(precision) == 1)
rows = rows(matrix);
cols = columns(matrix);
format = strcat(format_part, num2str(precision), "f");
for i = 1:rows
for j = 1:cols
fprintf(outputFile, sprintf(format, matrix(i,j)));
if (j ~= cols)
fprintf(outputFile, space_between_columns);
end
end
if i ~= rows
fprintf(outputFile, "\n");
end
end
fprintf(outputFile, "\n");
elseif (rows(precision) == 1 && columns(precision) == columns(matrix))
%here we have to custom make the rounding
rows = rows(matrix);
cols = columns(matrix);
for i = 1:rows
for j = 1:cols
fprintf(outputFile, sprintf(precision_format{j,1}, matrix(i,j)));
if (j ~= cols)
fprintf(outputFile, space_between_columns);
end
end
if i ~= rows
fprintf(outputFile, "\n");
end
end
fprintf(outputFile, "\n");
else
disp("STOP!, you invoked display_rounded_matrix with bad parameters");
end
elseif (nargin == 3 && outputFile == 0)
%print to screen instead
if (rows(precision) == 1 && columns(precision) == 1)
rows = rows(matrix);
cols = columns(matrix);
format = strcat(format_part, num2str(precision), "f");
for i = 1:rows
for j = 1:cols
printf(sprintf(format, matrix(i,j)));
if (j ~= cols)
printf(space_between_columns);
end
end
if i ~= rows
printf("\n");
end
end
printf("\n");
elseif (rows(precision) == 1 && columns(precision) == columns(matrix))
%here we have to custom make the rounding
rows = rows(matrix);
cols = columns(matrix);
for i = 1:rows
for j = 1:cols
%format = strcat(format_part, num2str(precision(1,j)), "f");
format = [format_part num2str(precision(1,j)) "f"];
printf(sprintf(format, matrix(i,j)));
if (j ~= cols)
printf(space_between_columns);
end
end
if i ~= rows
printf("\n");
end
end
printf("\n");
else
disp("STOP!, you invoked display_rounded_matrix with bad parameters");
end
elseif (nargin == 2)
display_rounded_matrix(matrix, precision, 0);
else
disp("STOP!, you invoked display_rounded_matrix with wrong number of arguments");
end
end
次に、次のように呼び出すことができます。
A = [ 53.0 410400 0.0094; 52.56 778300 -0.0069; 53.56 451500 -0.0340 ];
specified_rounding = [2 0 5];
display_rounded_matrix(A, specified_rounding, outputFile=0);
これにより、画面に次のように表示されます (各列の丸めが異なることに注意してください!
octave:5> display_rounded_matrix(A, specified_rounding, outputFile=0);
53.00 410400 0.00940
52.56 778300 -0.00690
53.56 451500 -0.03400
3 番目のパラメーターはファイル ハンドルです。出力をファイルにリダイレクトすることもできます。
outputFile = fopen("output.txt", "w");
A = [ 53.0 410400 0.0094; 52.56 778300 -0.0069; 53.56 451500 -0.0340 ];
specified_rounding = [2 0 5];
display_rounded_matrix(A, specified_rounding, outputFile);
上記と同じことを行いますが、出力をoutput.txtに送信します