GNU八度,圆了许多的单位精度(GNU Octave, round a number to unit

2019-07-30 07:04发布

在GNU八度版本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。如何做到这一点?

Answer 1:

如何四舍五入在八度矩阵的元素:

有许多不同的方式来圆一个矩阵,并在八度圆了许多。

选项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”表示期待float的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,使用功能全面

圆圆的功能并没有在八度精度参数。 然而,你可以通过100矩阵中的每个项目相乘,它四舍五入到最接近的INT,然后将每个项目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

试图做舍入,还记得八度可以有一些非常奇怪的行为,这八度力图统一适用四舍五入到矩阵中的所有项目。 所以,如果你有很大的不同值的多个列中,倍频可以看一个小小的partcularly价值,并认为:“嘿,我应该将其转换成指数:0.0001〜1.0E-04,因此,同样的事情被应用到整个矩阵。



Answer 2:

对于那些谁想要得到它的工作,而不深挖讨论为什么事情是这样(即八度round仍然不支持第二个参数定义精度)。

解决方法

a = [0.056787654, 0.0554464; 0.056787654, 0.0554464];
a
round_digit = 2;
if exist('OCTAVE_VERSION', 'builtin') ~= 0;
     a = a.*(10^(round_digit));
     a = floor(a);
     a = a.*(10^(-round_digit));
else
     a = round(a, round_digit);
end
a


Answer 3:

我发现下面的GNU八度音功能相当有用的。 这让你指定一个自定义的舍入的m×n矩阵的每一列。

将这个功能在一个名为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

第三个参数是一个文件句柄,你可以将输出重定向到一个文件太:

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



文章来源: GNU Octave, round a number to units precision