【问题标题】:Displaying a rounded matrix显示圆角矩阵
【发布时间】:2017-06-30 16:27:27
【问题描述】:

我想显示一个具有预定义精度的向量。例如,让我们考虑以下向量,

v = [1.2346    2.0012    0.1230    0.0001    1.0000]

如果我打电话,

mat2str(v, 1);

输出应该是,

1.2    2.0    0.1    0.0    1.0

如果我打电话,

mat2str(v, 2)

输出应该是,

1.24    2.00    0.12    0.00    1.00

等等。

我试过这段代码,但结果是一个空矩阵:

function s = mat2str(mat, precision)
    s = sprintf('%.%df ', precision, round(mat, precision));
end


mat2str(similarity, 3)

ans =

    Empty string: 1-by-0

如何显示具有预定义小数位数的向量?

【问题讨论】:

  • 你能解释一下为什么 round(mat,precision) 不是你想要的吗? mat2str 与 round 有何不同
  • matlab 中已经有一个mat2str 函数。将具有相同名称的函数定义为内置函数通常是一个坏主意
  • 你现在得到的东西有什么问题?你得到什么结果?你做了什么来调试问题?

标签: string matlab matrix vector


【解决方案1】:

format specifier for sprintf 已经提供了一种简单的方法来执行此操作,方法是使用 * 作为精度字段并将该值作为参数传递给 sprintf。因此,您的函数(我将其重命名为 mat2prec)可以编写如下:

function s = mat2prec(mat, precision)
  s = sprintf('%.*f', precision, mat);
end

【讨论】:

    【解决方案2】:

    这个适用于我的 Matlab 2014b:

    function s = mat2str(mat, precision)
        printstring=strcat('%',num2str(precision),'.',num2str(precision),'f','\t');
        s = sprintf(printstring, round(mat, precision));
    end
    

    【讨论】:

      【解决方案3】:
      function roundedmat2str(X,N)
          NN = num2str(N); % Make a number of the precision
          for ii = size(X,1):-1:1
              out(ii,:) = sprintf(['%.' NN 'f \t'],X(ii,:)); % create string
          end
          disp(out)
      end
      
      
      X=magic(3)+rand(3);N=2;
      MyRounding(X,N)
      8.69    1.03    6.77    
      3.32    5.44    7.80    
      4.95    9.38    2.19
      
      X = X(:).'; 
      MyRounding(X,N)
      8.69    3.32    4.95    1.03    5.44    9.38    6.77    7.80    2.19    
      

      请注意,sprintffprintf 在设置小数位数时已经进行了隐式舍入。

      另外:请不要将现有的函数名称用于您自己的函数或变量。永远不要调用 sum sum、平均值 mean 或 mat2str mat2str。执行totalaverageroundedmat2str 之类的操作。这使您的代码可移植,并确保您在使用自己的函数时不会出错,但期望使用默认函数,反之亦然。

      【讨论】:

        【解决方案4】:

        我认为这就是你最初想做的事情:

        s = sprintf(sprintf('%%.%df ', precision), mat)
        

        编辑

        如果您想将问题扩展到矩阵,可以使用这个稍微复杂一点的单行:

        s = sprintf([repmat(sprintf('%%.%df ', precision), 1, size(mat, 2)) '\n'], mat')
        

        与前一行的一个显着区别是它以回车结束。

        【讨论】:

        • IMO 这是最好的方法。
        • @kedarps 除了它不适用于矩阵之外,它会为每个输入矩阵创建一个行向量。
        • 实际上,OP 正在处理向量。对矩阵的引用实际上是由于您自己对 OP 问题的编辑。
        • 嗯,任何向量都是一维矩阵。但可以肯定的是,您的答案回答了这个问题,它只是不能扩展到矩阵。当然,您的编辑是。作为旁注,如果您希望您回复的人阅读您的 cmets,请使用 @username 语法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-07
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多