向量化的替代方法是识别代码中昂贵的操作并以某种方式减少它们。例如,log(2/L) 被调用 100*1000*1000 次,输入不依赖于三个 for 循环中的任何一个。如果我们在 for 循环之外计算这个值,那么我们可以使用它来代替:
logResult = log(2/L);
和
V2(j,k)=V1(j,k)*log(2/L)*tan(pi/L*(x(i)+L/2)*j);
变成
V2(j,k)=(V1(j,k)*logResult*tan(pi/L*(x(i)+L/2)*j));
同样,代码调用tan 函数同样100*1000*1000 次。注意这个计算,tan(pi/L*(x(i)+L/2)*j) 不依赖于k。因此,如果我们在 for 循环之外计算这些值,我们可以将这个计算减少 1000 倍:
tanValues = zeros(lenx,n);
for i=1:lenx
for j=1:n
tanValues(i,j) = tan(pi/L*(x(i)+L/2)*j);
end
end
V2(j,k) 的计算变为
V2(j,k)=V1(j,k)*logResult*tanValues(i,j);
此外,内存可以预先分配给V2 和V3 矩阵,以避免在每次迭代时发生内部调整大小。只需在for 循环之外执行以下操作
V2 = zeros(n,n);
V3 = zeros(lenx,n);
使用 tic 和 toc 在我的工作站上将原始执行时间从 ~14 秒缩短到 ~6 秒。这仍然比 natan 的解决方案(对我来说大约 2 秒)慢三倍。