向量化一个for循环,其中输入取决于输出

时间:2012-12-05 08:45:12

标签: performance matlab for-loop vectorization

关于循环依赖的向量化,我有一个复杂的问题,我希望得到一些帮助。

我们X1是长度为n1的向量,X2是长度为n2的向量,F1N1 x { {1}}矩阵,n1F2 x N2矩阵,n2Q x N1矩阵,符号为{ {1}}是索引向量。 ntrapz是梯形数值积分的函数。我想按如下方式计算矩阵N2

p...

问题是更新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 的值以进行下一次迭代。我想知道我们是否可以对这样的for循环进行矢量化。如果没有,任何加速代码的想法?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

矢量化通常是并行操作的方法。但是,在您的情况下,您似乎有顺序操作,而这些操作通常不适合矢量化。

我不熟悉您使用的功能,但我能想到的唯一可能加速计算的方法是以非依赖形式编写它。请注意,这是一个数学练习而不是编程练习,这是一个简单的例子:

假设公式等于:

Y(1)=0.5;
Y(t)=0.3*Y(t-1)+epsilon(t);
% Let as assume epsilon is also known
epsilon = rand(9,1)

计算Y(10)的简单方法是进行10个计算步骤。

for t=2:10
    Y(t)=0.3*Y(t-1)+epsilon(t);
end

计算Y(10)的最快方法是做这样的事情(不确定它是否正确,但应该接近)

Y(10)=Y(1)*0.3^9 + sum(epsilon.^(1:9))

总而言之:“向量化”循环的唯一方法是,如果你可以显着地帮助计算机并且基本上让它进行不同的计算。如果这是不可能的,你当然可以尝试通过将其作为mex文件来挤出一些额外的速度。