请看这个MATLAB代码:
formatspec = '%5i';
delay = num2str(d,formatspec);
datasave = [datasave; repeating_character blanks(5) num2str(lenmax) blanks(5) delay];
end
我想以表格的形式显示结果datasave
。变量d
值将在for循环中从2
增加到127
。 lenmax
变量没有问题,因为它始终是一位数字。但问题在于变量delay
。在第一个实例中delay = 2
的值,因为循环以2
开头,因此特定维度将分配给datasave
。然后d
的值继续在循环中递增。在9 th 实例期间,它将变为10
,这是2
个数字整数。问题出在这里。当它变为2位数字整数(10)时,尺寸将不匹配,并且使用vertcat
出现错误,因为尺寸不同。
我认为使用%5d
可以解决问题,但事实并非如此。如果我更改循环,使其从10
开始到127
,则问题会在delay = 100
时出现。将显示10
到99
的值,但在显示100
时,会弹出有关尺寸不匹配的相同错误。
请有人能告诉我如何解决这个问题吗?
答案 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)