有没有办法优化甚至可能将其向量化? (MATLAB)

时间:2015-12-19 12:04:43

标签: matlab loops if-statement optimization vectorization

我在两个循环中有一个if语句,它运行得太慢,我认为它可以进行优化。 NF_zeta是一个2D逻辑数组。

for k = 2:Nx
    for l = 2:Ny
        if NF_zeta(l,k)
            z2(l,k) = z1(l,k) - optVar2*(U2(l,k) - U2(l,k-1) + V2(l,k) - V2(l-1,k));
        end
    end
end

以下是分析器的结果 http://i.imgur.com/oMropeL.png

我尝试使用单循环来处理条件语句。我写了一些类似于一个循环for [1 4 5]的内容,

for idx = NF_zeta_v
    z2(idx(1),idx(2)) = z1(idx(1),idx(2)) - optVar2*(U2(idx(1),idx(2)) - U2(idx(1),idx(2)-1) + V2(idx(1),idx(2)) - V2(idx(1)-1,idx(2)));
end

这里预先创建NF_zeta_v

c_z = 1;
for l = 1:Ny
    for k = 1:Nx
        if NF_zeta(l,k)
           NF_zeta_v(:,c_z) = [l;k];
           c_z = c_z + 1;
        end
    end
end

花了差不多两倍的时间。分析器http://i.imgur.com/OegeEOC.png

的结果

我还能尝试什么,有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这是使用diff -

的一个矢量化解决方案
diffs = diff(U2(2:end,:),[],2) + diff(V2(:,2:end),[],1);
allvals = z1(2:end,2:end) - optVar2*diffs;
z2(2:Ny,2:Nx) = NF_zeta(2:Ny,2:Nx).*allvals;