【发布时间】:2013-12-13 22:47:08
【问题描述】:
我的这部分代码(如下所示)由于存在许多嵌套循环而需要很长时间才能运行。有没有办法可以消除这些嵌套循环以使其运行得更快?
for k = 1:numel(UpscaledZLen.pq)
for j = 1:numel(UpscaledRowLen.pq)
for i = 1:numel(UpscaledColLen.pq)
iZ = 1;
while iZ <= UpscaledZLen.pq(k)
for ZLag = 1:iZ
ihRow = 1;
while ihRow <= UpscaledRowLen.pq(j)
for hRowLag = 1:ihRow
ihCol = 1;
while ihCol <= UpscaledColLen.pq(i)
for hColLag = 1:ihCol
temp1(hColLag) = trapz(AnalGamma(hRowLag,...
1:hColLag,...
ZLag));
end
temp2(ihCol) = trapz(temp1);
ihCol = ihCol + 1;
end
temp3(hRowLag) = trapz(temp2);
end
temp4(ihRow) = trapz(temp3);
ihRow = ihRow + 1;
end
temp5(ZLag) = trapz(temp4);
end
temp6(iZ) = trapz(temp5);
iZ = iZ + 1;
end
NormVariance_AnalCorrAvg(i, j, k) = (2/((UpscaledRowLen.pq(j)*...
UpscaledColLen.pq(i)*UpscaledZLen.pq(k))^2))*trapz(temp6);
end
end
end
这段代码试图实现以下积分表达式:
EDIT (SSCCE): 举个简单的例子,我采用了以下变量大小,然后使用上面的代码查看运行这些特定变量大小需要多少时间: p>
nRow = 4;
nCol = 4;
nZ = 4;
RowLenScale.pq = 1:nRow;
ColLenScale.pq = 1:nCol;
UpscaledRowLen.pq = RowLenScale.pq(rem(RowLenScale.pq(end), RowLenScale.pq) == 0);
UpscaledColLen.pq = RowLenScale.pq(rem(ColLenScale.pq(end), ColLenScale.pq) == 0);
ZLenScale.pq = 1:nZ;
UpscaledZLen.pq = ZLenScale.pq(rem(ZLenScale.pq(end), ZLenScale.pq) == 0);
AnalGamma = rand(nRow, nCol, nZ);
对于这个例子,它只需要 0.321976 秒,而对于 nRow = 100;、nCol = 100; 和 nZ = 20; 的原始情况,它需要超过 24 小时并且仍在使用最外层循环索引运行在k = 4。
【问题讨论】:
-
提供一个我们可以运行的例子,或者分析它并告诉我们瓶颈在哪里。
-
很难说你想做什么,但你肯定是以错误的方式编码它。您需要解释您想要实现的目标,因为那是太多不必要的循环。难怪这需要很长时间,但实际上您可能有数十亿次迭代。
-
您能编辑一下您的解析表达式吗?你发布的那个是无效的。什么是积分变量,
analgamma依赖于哪些变量? -
愚蠢的自动更正 - 从上面:小节 -> 子功能。此外,如果不访问不幸命名的
AnalGamma函数或某些代理,这里的任何人都很难对此进行测试并提供真正有用的帮助。 -
我一直在查看这篇文章,只是为了嘲笑函数的名称。
标签: matlab nested-loops performance