CAT参数:维度不一致

时间:2014-07-08 09:59:52

标签: string matlab padding number-formatting

请看这个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的值继续在循环中递增。在9 th 实例期间,它将变为10,这是2个数字整数。问题出在这里。当它变为2位数字整数(10)时,尺寸将不匹配,并且使用vertcat出现错误,因为尺寸不同。

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

请有人能告诉我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

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

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

>> 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'

答案 1 :(得分:0)

如果你看一下edit num2str,在主函数的底部,你会看到这个(或类似的东西,无疑取决于MATLAB版本):

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

这基本上意味着您使用formatspec明确放入的任何空格都会被删除;如果你问我一个bug。

最简单的方法是使用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)