避免循环进行矩阵计算

时间:2017-10-21 02:39:08

标签: matlab performance for-loop coding-efficiency

我在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版本不适用于周期性边界条件。

1 个答案:

答案 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));

在循环前面。