【发布时间】: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 = 2210和Nx = 927 -
@Divakar 你的意思是
NF_zeta中有多少trues?,如果这就是你的意思sum(sum(NF_zeta)) = 1280456。如果你的意思是别的,请解释一下。 -
输入似乎是
z1、optVar2、U2、V2。看看我是否错过了列出任何其他相关输入。那么它们的尺寸是多少? -
@Divakar
z1、U2和V2都是 2210x927。optVar2只是一个标量,它不是一个数组。
标签: matlab loops if-statement optimization vectorization