GNU八度,以一个数字为单位精度

在GNU Octave 3.4.3版本中,我想把一个matrix舍入到2个单位的精度上,像这样的一个matrix的内容。

mymatrix=[1.1234567, 2.12345; 3.1234567891, 4.1234]; disp(mymatrix); 

这打印:

 1.1235 2.1235 3.1235 4.1234 

正如你所看到的,disp强制精度为“5”,我希望单位精度为2.我该怎么做?

Solutions Collecting From Web of "GNU八度,以一个数字为单位精度"

如何在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 

输出, 请注意“%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,使用循环功能

Round函数在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 

在尝试舍入时,八度可能会有一些非常奇怪的行为,请记住,八度试图很难将舍入应用于矩阵中的所有项目。 所以,如果你有多个不同的值,八度可能会看到一个非常微小的值,并且想:“嘿,我应该把它转换成指数: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 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 

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

 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