【问题标题】:Is there a way to optimize or maybe even vectorize this? (MATLAB)有没有办法优化甚至矢量化? (MATLAB)
【发布时间】:2016-03-26 01:00:24
【问题描述】:

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

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

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

【问题讨论】:

  • 相关输入的数据大小是多少?
  • @Divakar Ny = 2210Nx = 927
  • @Divakar 你的意思是NF_zeta 中有多少trues?,如果这就是你的意思sum(sum(NF_zeta)) = 1280456。如果你的意思是别的,请解释一下。
  • 输入似乎是z1optVar2U2V2。看看我是否错过了列出任何其他相关输入。那么它们的尺寸是多少?
  • @Divakar z1U2V2 都是 2210x927。 optVar2 只是一个标量,它不是一个数组。

标签: matlab loops if-statement optimization vectorization


【解决方案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;

【讨论】:

    【解决方案2】:

    如果N_xN_y 是大小值,您可能想要这样的东西:

    Z2 = (z1-optVar2*(U2-circshift(U2, [0 1])+V2-circshift(V2, [1 0]))).*(double(NF_zeta));
    Z2(1,:) = 0;
    Z2(:,1) = 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多