MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   同时分配给矩阵的多个子矩阵。通过向量索引可能的优化 (https://www.labfans.com/bbs/showthread.php?t=26724)

poster 2019-12-14 20:46

同时分配给矩阵的多个子矩阵。通过向量索引可能的优化
 
是否有一种聪明的方法可以向量化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个方程组的数值有限差分方法中子例程的一部分,因此,该问题可能与在方程组(尤其是[URL="http://en.wikipedia.org/wiki/Partial_differential_equation"]PDE)[/URL]上进行矩阵计算的任何人有关。有关优化代码的建议将不胜感激!



[B]回答:[/B]

若要了解如何在没有循环的一行中编写赋值,将数组temp绘制为矩形可能会有所帮助。然后,将合并到U的不同求和算子不过是temp子矩形(或子网格,如果要跟踪temp中的单个元素,这会导致U的特定元素),这些子元素将移至分别为左,右,上,下。

%# define row, column shifts rowShift = 6; colShift = 1; %# That's how we'd like to shift %# 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); %# assign U U = A * temp(rowShift+1 : end-rowShift, colShift+1 : end-colShift) +... B * temp(rowShift+1 : end-rowShift, 1 : end-2*colShift) + ... C * temp(rowShift+1 : end-rowShift, 2*colShift+1 : end) + ... D * temp(1 : end-2*rowShift, colShift+1 : end-colShift) + ... E * temp(2*rowShift+1 : end, colShift+1 : end-colShift);

[url=https://stackoverflow.com/questions/5448706]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 23:38

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.