【发布时间】:2012-11-23 01:01:41
【问题描述】:
我有一个关于循环依赖向量化的复杂问题,我想从你那里得到一些帮助。
让我们X1 是一个长度为n1 的向量,X2 是一个长度为n2,F1 的向量是一个N1xn1 矩阵,F2 是一个N2 xn2 矩阵,Q 是N1xN2 矩阵,符号p... 是索引向量。 ntrapz 是梯形数值积分的函数。我想计算矩阵Q如下:
for i1=1:N1
F1_13tmp=F1(i1, p1_13)'; % '
F1_13=F1_13tmp(:,ones(n2,1));
for i2=1:N2
F2_13 = F2(i2, p2_13);
Q_13_13 = Q(p1_13, p2_13);
Q(i1,i2) = Q(i1,i2) +
ntrapz(X2(p2_13), ntrapz(X1(p1_13)', Q_13_13.*F1_13).*F2_13);
end
end
问题是更新Q(i1,i2) 会更改Q_13_13 = Q(p1_13, p2_13) 的值以进行下一次迭代。我想知道我们是否可以矢量化这样的 for 循环。如果没有,有什么加快代码速度的想法吗?
提前感谢您的帮助。
【问题讨论】:
-
在 Matlab 中对所有内容进行矢量化的旧建议就是这样,旧建议。最近(可能自 2010 年以来)Matlab 运行时的进步使基于循环的程序在许多情况下与矢量化程序一样快。我不会说你不能向量化你的代码(因为循环依赖)或者如果你这样做你不会看到性能改进,但不要提高你对向量化版本将显示显着性能的期望改进,足以证明您(以及一般情况下)花在设计上的时间是合理的。
-
感谢您的评论。我有 Matlab R2010b,我不知道基于循环的程序是否真的和矢量化程序一样快。在程序中由于N1*N2比较大(91204),所以即使像“Q_13_13 = Q(p1_13, p2_13)”这样的简单命令也需要相当长的时间(1,06s)。
标签: performance matlab for-loop vectorization