CAT 参数:尺寸不一致

Posted

技术标签:

【中文标题】CAT 参数:尺寸不一致【英文标题】:CAT arguments: dimensions are inconsistent 【发布时间】: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 时,会弹出关于尺寸不匹配的相同错误。

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

【问题讨论】:

【参考方案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) 
datasaveend+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)

【讨论】:

以上是关于CAT 参数:尺寸不一致的主要内容,如果未能解决你的问题,请参考以下文章

移动端适配剖析

前台请求参数与后台方法参数一致与不一致的情况

2.类型不一致可变参数模板与类型一致函数模板

为啥微信的个人中心页面图标风格不一致

sprintf转换类型和参数类型必须一致么

qt界面显示内容相同