在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。如何做到这一点?
在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。如何做到这一点?
有许多不同的方式来圆一个矩阵,并在八度圆了许多。
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
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
圆圆的功能并没有在八度精度参数。 然而,你可以通过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
你是否注意到,上述选项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,因此,同样的事情被应用到整个矩阵。
对于那些谁想要得到它的工作,而不深挖讨论为什么事情是这样(即八度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
我发现下面的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