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

And*_*uri 4 arrays indexing matlab

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

for ii= 1:10
   output(ii)=rand(3);
end
Run Code Online (Sandbox Code Playgroud)

我收到了错误

In an assignment  A(:) = B, the number of elements in A and B must be the same
Run Code Online (Sandbox Code Playgroud)

要么

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

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

And*_*uri 5

出现此错误的原因是您尝试使用比其大小更多(或更少)的值填充变量块.换句话说,你有一个A(:)=B关于size(A(:))不同之处的陈述size(B).

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

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

有两种方法可以做到这一点.其中之一就是创建一个适合回报的矩阵,例如output=zeros(3,3,10).

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

for ii= 1:10
   output(:,:,ii)=rand(3);
end
Run Code Online (Sandbox Code Playgroud)

或者,您可以将其填充output单元格数组.当函数的返回每次改变大小时,这尤其有用,例如rand(ii);

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

for ii= 1:10
   output{ii}=rand(ii);
end
Run Code Online (Sandbox Code Playgroud)

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

在可能的学习方法上,通过键入dbstop if error命令行,在代码出错时激活调试帮助.当MATLAB抛出错误时,这将触发调试停止,您可以键入size(rand(ii))size(output(ii))查看两者的大小.

通常,阅读所使用的功能的文档也有助于查看是否可能有不同的大小.

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

  • 请保持原样.这是我们将来需要链接的规范副本. (2认同)