17

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にします。これを行うにはどうすればよいですか。

4

3 に答える 3

29

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

Output、「%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ため、同じ指数関数が行列内のデータ構造全体に適用されます。

于 2012-07-08T19:59:50.750 に答える
6

なぜこのようになっているのかという議論を深く掘り下げずにそれを機能させたい人向けです(つまり、オクターブ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
于 2015-08-08T13:43:09.553 に答える
0

次の 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に送信します

于 2012-08-06T00:17:50.420 に答える