【问题标题】:CAT arguments: dimensions are inconsistentCAT 参数:尺寸不一致
【发布时间】:2014-07-08 09:59:52
【问题描述】:

请看这段 MATLAB 代码:

formatspec = '%5i';
delay = num2str(d,formatspec);
datasave = [datasave; repeating_character blanks(5) num2str(lenmax) blanks(5) delay];
end

我想以表格的形式显示结果datasave。变量d 的值将在for 循环中从2 递增到127lenmax 变量没有问题,因为它始终是一个数字。但问题在于变量delay。在第一个实例中,delay = 2 的值,因为循环以2 开始,一个特定的维度将被分配给datasave。然后d 的值在循环中不断增加。在第 9th 实例期间,它将变为 10,这是一个 2 数字整数。问题就在这里。当它变成 2 位整数 (10) 时,尺寸将不匹配,并且使用 vertcat 会出现错误,因为尺寸不一样。

我认为使用%5d 应该可以解决问题,但事实并非如此。如果我将循环更改为从10 开始到127,则在delay = 100 时会出现问题。将显示从1099 的值,但在显示100 时,会弹出关于尺寸不匹配的相同错误。

谁能告诉我如何解决这个问题?

【问题讨论】:

    标签: string matlab padding number-formatting


    【解决方案1】:

    正如@RodyOldenhuis 解释的那样,我认为这是numstr 中的一个微妙错误。

    解决此问题的一种方法是将整个向量一次传递给num2str,这样就不会修剪空白(它仍然会被修剪,但不会超过最长字符串所允许的范围):

    >> delays = num2str((2:127)', '%3d');
    >> whos delays
      Name          Size            Bytes  Class    Attributes
    
      delays      126x3               756  char    
    
    >> delays([1 end],:)
    ans =
      2
    127
    

    您也可以选择用零而不是空格填充:

    >> num2str(2, '%05d')
    ans =
    00002
    

    您还可以使用未记录的sprintfc(它返回一个未修剪字符串的单元数组):

    >> sprintfc('%5d', (2:127)')
    ans = 
        '    2'
             .
             .
        '  127'
    

    【讨论】:

      【解决方案2】:

      如果您查看 edit num2str,在 main 函数的底部,您会看到以下内容(或类似内容,无疑取决于 MATLAB 版本):

      s = strtrim([cols{:}]);
      

      这基本上意味着您使用格式规范明确输入的任何空白都会被删除;如果你问我,这是一个错误。

      使用char 进行连接是最简单的:

      datasave = char(datasave, [repeating_character blanks(5) num2str(lenmax) blanks(5) delay]);
      

      或者,您可以使用cellstrings

      %# in the loop
      %# (better to do this with pre-allocation) 
      datasave{end+1} = [...
          repeating_character,...
          blanks(5),...
          num2str(lenmax),... 
          blanks(5),...
          delay];
      
      ...
      
      %# after the loop
      datasave = char(datasave);
      

      或者,您可以使用int2str

      delay = int2str((2:127).')
      

      或者,您可以使用sprintf

      formatspec = '%5i\n';
      delay = sprintf(formatspec, 2:127)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 2014-07-13
        • 2011-12-05
        • 2017-01-20
        相关资源
        最近更新 更多