在赋值A(:) = B中,A和B中的元素数必须相同

时间:2017-06-15 09:04:39

标签: arrays matlab indexing

尝试运行我的代码时,例如

for ii= 1:10
   output(ii)=rand(3);
end

我收到错误

In an assignment  A(:) = B, the number of elements in A and B must be the same

In an assignment  A(I) = B, the number of elements in B and I must be the same.

这个错误是什么意思?摆脱它的方法是什么?

1 个答案:

答案 0 :(得分:5)

出现此错误的原因是您尝试使用比其大小更多(或更少)的值填充变量块。换句话说,您有A(:)=Bsize(A(:))不同的声明size(B)

在问题的示例中,rand(3)会返回3x3矩阵,但output(ii)只是一个值(即使output可能更大,{{ 1}}只是output(ii))的单个值,因此output返回的值不适合rand(3)

为了解决这个问题,您需要更改output变量的大小,以便有足够的空间来容纳所有结果。

有两种方法可以做到这一点。其中之一是创建适合回报的矩阵,例如: output

然后我们可以将代码更改为

output=zeros(3,3,10)

或者,您可以将for ii= 1:10 output(:,:,ii)=rand(3); end 填充为单元格数组。当函数的返回每次改变大小时,这尤其有用,例如, output

在这种情况下,以下方法可行

rand(ii);

可能与问题中的示例不同,在实际情况下,您不知道输出返回的大小,因此您不知道用于修复代码的两个选项中的哪一个。

在可能的学习方法上,通过在命令行中键入for ii= 1:10 output{ii}=rand(ii); end ,在代码出错时激活调试帮助。当MATLAB抛出错误时,这将触发调试停止,您可以键入dbstop if errorsize(rand(ii))来查看两者的大小。

通常,阅读正在使用的函数的文档也有助于查看是否可以使用不同的大小。

也就是说,第二个选项,单元阵列,将始终确保一切都适合。然而,矩阵通常在MATLAB中更快更容易使用,因此如果可以,您应该针对基于矩阵的解决方案。