有没有一种聪明的方法来矢量化一个将元素分配给矩阵子矩阵的 for 循环?
最初,我有两个 for 循环:
U=zeros(6*(M-2),M-2);
for k=2:M-3
i=(k-1)*6+1;
for j=2:M-3
U(i:i+5,j)=A*temp(i:i+5,j)+B*temp(i:i+5,j-1)+C*temp(i:i+5,j+1)+D*temp(i-6:i-1,j)+E*temp(i+6:i+11,j);
end
end
然后我对内部循环进行矢量化,这样代码现在读取
U=zeros(6*(M-2),M-2);
j=2:M-2;
for k=2:M-3
i=(k-1)*6+1;
U(i:i+5,j)=A*temp(i:i+5,j)+B*temp(i:i+5,j-1)+C*temp(i:i+5,j+1)+D*temp(i-6:i-1,j)+E*temp(i+6:i+11,j);
end
这将我的 CPU 时间减少了 90% 以上,所以我想知道是否可以对外部循环执行相同的操作,但这似乎有点棘手,因为我在 U 矩阵中分配了 (6x1) 矩阵。我试过
U=zeros(6*(M-2),M-2);
k=2:M-3;
i=(k-1)*6+1;
j=2:M-2;
U(i:i+5,j)=A*temp(i:i+5,j)+B*temp(i:i+5,j-1)+C*temp(i:i+5,j+1)+D*temp(i-6:i-1,j)+E*temp(i+6:i+11,j);
但这失败了,因为 i:i+5 只取出我想要的前 6 个索引。
我也尝试使用 reshape() 函数将矩阵转换为向量,但一次分配给多个元素块似乎仍然很困难。代码中总共有三个这样的 for 循环,所以我想另一种优化是以某种方式并行化它们。但是,如果无法访问并行工具箱,在我看来,如果可能的话,矢量化是一个很好的解决方案。
该代码是数值有限差分法中子程序的一部分,用于求解网格上的 6 个方程组,因此这个问题可能与任何在方程组(尤其是PDE )上进行矩阵计算的人相关。对优化代码的建议将不胜感激!