GNU Octave,将数字舍入到单位精度

Eri*_*ski 14 linux precision matrix rounding octave

在GNU Octave版本3.4.3中,我想在矩阵的内容上将矩阵舍入为2个单位精度.

mymatrix=[1.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
Run Code Online (Sandbox Code Playgroud)

这打印:

1.1235   2.1235
3.1235   4.1234
Run Code Online (Sandbox Code Playgroud)

如您所见,disp强制精度为'5',我希望单位精度为2.我该怎么做?

Eri*_*ski 24

如何在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
Run Code Online (Sandbox Code Playgroud)

输出,请注意"%5.2f"标记.'f'表示期望浮动,5表示占用5个空格.2表示小数点后2个单位精度.

ans = 100.12
ans =  3.12
ans =  2.12
ans =  4.12
Run Code Online (Sandbox Code Playgroud)

选项2,使用eval和mat2str舍入到有效数字

mymatrix2=[100.1234567, 2.12345; 3.1234567891, 4.1234];
j = mat2str(mymatrix2, 3);
mymatrix2=eval(j)
Run Code Online (Sandbox Code Playgroud)

输出,矩阵四舍五入为3 位有效数字,通知100.123舍入为100,而2.12345舍入为2.12

mymatrix2 =
   100.0000     2.1200
     3.1200     4.1200
Run Code Online (Sandbox Code Playgroud)

选项3,使用圆函数

圆函数在Octave中没有精度参数.但是你可以通过将矩阵中的每个项乘以100,将其四舍五入到最接近的int,然后将每个项除以100来破解它:

mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
round(mymatrix .* 100) ./ 100
Run Code Online (Sandbox Code Playgroud)

输出,圆形正确发生:

ans =
   100.1200     2.1200
     3.1200     4.1200
Run Code Online (Sandbox Code Playgroud)

选项4,指定output_precision(num)

您注意到上面的选项3保留了尾随零,这可能是不合需要的,因此您可以通过设置output_precision告诉它们消失:

mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
output_precision(3)
disp(mymatrix)
Run Code Online (Sandbox Code Playgroud)

输出:

100.1235     2.1235
  3.1235     4.1234

100.123     2.123
  3.123     4.123
Run Code Online (Sandbox Code Playgroud)

当尝试进行舍入时,Octave可能会有一些非常奇怪的行为,请记住,八度音很难均匀地将舍入应用于矩阵中的所有项.因此,如果你有多个具有完全不同的值的列,八度音可能会看到一个非常微小的值,并认为:"嘿,我应该将其转换为指数:0.0001到1.0e-04,因此,同样的事情适用于整个矩阵.


Ufo*_*fos 5

对于那些想要在不深入讨论的情况下使它起作用的人(为什么八度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
Run Code Online (Sandbox Code Playgroud)

  • 为什么八度音阶不支持第二个参数round? (2认同)
  • @JonathonReinhart,我在`savannah.gnu.org`上找不到相应的问题,但下面是解释。行为`round(number,precision)`来自于您具有**符号数学** [`sym`]包,该包用增强的二元参数替换了裸眼matlab的默认一元参数round。版。由于octave旨在仅实现基线matlab,并且实现其软件包是一个不同的里程碑,因此用户将获得80年代的round风格。 (2认同)