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
有许多不同的方法来舍入矩阵并以八度为单位对数字进行舍入.
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)
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)
圆函数在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)
您注意到上面的选项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,因此,同样的事情适用于整个矩阵.
对于那些想要在不深入讨论的情况下使它起作用的人(为什么八度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)