【发布时间】:2011-07-23 20:26:48
【问题描述】:
有没有一种巧妙的方法来向量化一个将元素分配给矩阵子矩阵的 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() 函数将矩阵转换为向量,但一次分配给多个元素块似乎仍然很困难。总共有 3 个这样的 for 循环 代码,所以我想另一种优化是以某种方式并行化它们。但是,如果无法访问并行工具箱,在我看来,如果可能的话,矢量化是一个很好的解决方案。
代码是数值有限差分法中子程序的一部分,用于求解网格上的 6 个方程组,因此这个问题可能与任何从事矩阵计算的人相关 方程组,尤其是PDEs。非常感谢您提出优化代码的建议!
【问题讨论】:
标签: optimization matlab matrix vectorization pde