关于循环依赖的向量化,我有一个复杂的问题,我希望得到一些帮助。
我们X1
是长度为n1
的向量,X2
是长度为n2
的向量,F1
为N1
x { {1}}矩阵,n1
为F2
x N2
矩阵,n2
为Q
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循环进行矢量化。如果没有,任何加速代码的想法?
提前感谢您的帮助。
答案 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文件来挤出一些额外的速度。