1

??? Subscripted assignment dimension mismatch.我收到值何时days达到的错误,13因为第 7 行的 legend_vec 列大小可能达到 13。

days = [1     2     3     4     5     6    13];
for i=1:nTime
    legend_vec(i,:)=(['After ',num2str(days(i)),' days']);
end

我怎样才能避免错误并在我存储时存储所有天legend_vec?谢谢。

4

2 回答 2

1

当您尝试将复合字符串存储到数组中时,它会将其存储为 Ascii 或 Unicode 字符编号的列表。因此,如果我尝试将字符串 'Hello world' 作为数组的第一行插入,那么第一行实际上将是:

>>> my_strs = []; 
>>> my_strs(1,:) = "Hello world"
my_strs =

72   101   108   108   111    32   119   111   114   108   100

请注意,这隐含地构成my_strs了一个 1×11 数组。如果我尝试添加一个字符串作为第二行,但它没有评估为具有 11 个字符的长度代码,它将给出一个错误:

>>> my_strs(2,:) = "Hi there"
error: A(I,J,...) = X: dimensions mismatch

所以你要么需要添加空格来填充你所有天的长度,当它们变成字符串(所以你所有的字符串都有统一的长度),或者做一些更方便的事情,比如将所有字符串存储到一个单元格数组中,它们可以有不同的长度.

要使用元胞数组执行此操作,您可以执行以下操作:

>>> my_strs = {};
>>> my_strs{1} = "Hello world"
my_strs =

{
  [1,1] = Hello world
}

>>> my_strs{2} = "Hi there"
my_strs =

{
  [1,1] = Hello world
  [1,2] = Hi there
}

>>> my_strs{1,1}
ans = Hello world
>>> my_strs{1,2}
ans = Hi there

将其映射到您在上述问题中显示的循环中使用的索引约定应该很简单。

完全披露:我正在使用 Octave 测试上述代码,因为我个人更喜欢抵制 Matlab。如果您关心为什么会这样,您可以询问元数据或其他内容,但就这个问题而言,我认为 Octave 中的测试不会对正确答案产生任何影响。

于 2012-04-11T20:11:11.790 回答
1

使用字符串元胞数组。元胞数组(由{}字符定义)用于处理不同对象的数组,例如不同的数据类型或不同长度的字符串。

要使用元胞数组,请按如下方式更改代码:

days = [1     2     3     4     5     6    13];
for i=1:length(days)
    legend_cell{i,:}=(['After ',num2str(days(i)),' days']);
end

由于这是一种常见用途,因此该legend命令可以接受它作为输入。

plot(randn(10,7),'.')
legend(legend_cell)

对于其他用途,您可以使用以下符号访问单个字符串:

thirdString = legend{3};

或者,如果您绝对必须有一个矩形字符数组,Matlab 支持以下约定,让您回到开始的位置:

legend_vec_in_chararray = char(legend_cell);  

char函数将根据需要填充空格以创建矩形数组。

于 2012-04-11T20:22:45.933 回答