我需要消除Matlab代码中的循环。在这个过程中,我遇到了以下问题。以下是代码的一部分
Nx=11; Ny=11;
A=rand(Ny,Nx);
A1=A;
for j=2:Ny-1
for i=2:Nx-1
A(j,i)=A(j,i-1);
end;
end;
A1(2:Ny-1,2:Nx-1)=A1(2:Ny-1,1:Nx-2);
A2=A-A1;我知道A不等于A1。右侧的j-1索引的情况也是如此。但是,如果我们使用索引i + 1或j + 1,那么一切都很好。
发布于 2021-03-25 07:37:34
问题相对简单:您一次将A1的所有列都向右移动(在过程中将第1列复制到第2列并丢弃列Nx-1 ),而for循环则将A的列从左到右一次向右移动一列。这意味着首先用第1列的内容覆盖第2列,然后用第2列的内容覆盖第3列,依此类推,最后得到第一列的Nx-1副本。(当我提到复制/移动/丢弃列时,我指的是从行2到行Ny-1的值。)
正如您已经注意到的,如果您修改您的循环以将列向左移动,即
for j=2:Ny-1
for i=2:Nx-1
A(j,i)=A(j,i+1);
%...那么这个问题就不会发生,因为在用新值覆盖它们之前,您有机会读取任何给定列的原始内容并将它们保存到其他地方。
当for循环从左到右迭代列时,上述所有结果都适用。如果您反转迭代的方向,即
%...
for i=Nx-1:-1:2
A(j,i)=%...然后,向右移动列按预期工作,而将它们向左移动会产生虚假的结果。
https://stackoverflow.com/questions/66775420
复制相似问题