我在matlab编码,因为matlab不能很好地处理“for”循环,所以我需要避免它们,所以我可以尽可能快地完成它。这是我的代码的一部分,处理“for”。
for i = 1:size(U,1)
for j=1:size(U,2)
v(i,j) = U(mod(i+1-1,size(U,1))+1,j) + U(i,mod(j+1-1,size(U,2))+1) ...
+ U(mod(i-1-1,size(U,1))+1,j) + U(i,mod(j-1-1,size(U,2))+1) - 4*U(i,j);
end
end
我的矩阵中存在周期性边界条件,这就是我使用“mod”函数的原因。 这段代码实际上类似于matlab中的“del2”函数,但matlab版本不适用于周期性边界条件。
答案 0 :(得分:0)
使用meshgrid
的矢量化版本:
[n,m] = meshgrid(1:size(U,2),1:size(U,1));
v = U(sub2ind(size(U),mod(m,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n,size(U,2))+1)) ...
+ U(sub2ind(size(U),mod(m-2,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n-2,size(U,2))+1)) - 4.*U;
您还可以通过preallocating memory加快循环(可能是多个数量级)。在这种情况下,只需添加
v = zeros(size(U));
在循环前面。