在Matlab中使用向量化循环进行双重求和
|
我想对这个double for循环进行矢量化处理,因为这是我代码中的瓶颈。由于Matlab是一种基于一种的索引语言,因此我必须为M = 0创建一个附加项。
R,r,lambda是常数
Slm(L,M),(L,M)是矩阵70x70
Plm(L,M)是70x71的矩阵
Cl(L),Pl(L)是向量70x1
% function dU_r
s1 = 0;
for L = 2:70
s1 = s1 + ((R/r)^L)*(L+1)*Pl(L)*Cl(L);
for m = 1:L
s1 = s1 + ((R/r)^L)*(L+1)*Plm(L,M)*(Clm(L,M)*...
cos(M*lambda) + Slm(L,M)*sin(M*lambda));
end
end
dU_r = -(mu_p/(r^2))*s1;
% function dU_phi
s2=0;
for L = 2:70
s2 = s2 + ((R/r)^L))*Plm(L,1)*Cl(L);
for m = 1:l
s2 = s2 + ((R/r)^L)*(Plm(L,M+1)-M*tan(phi)*Plm(L,M))*...
(Clm(L,M)*cos(M*lambda) + Slm(L,M)*sin(M*lambda));
end;
end;
dU_phi = (mu_p/r)*s2;
% function dU_lambda
s3=0;
for L=2:70
for m=1:L
s3 = s3 + ((R/r)^L)*M*Plm(L,M)*(Slm(L,M)*cos(M*lambda)...
- Clm(L,M)*sin(M*lambda));
end;
dU_lambda = (mu_p/r)*s3;
没有找到相关结果
已邀请:
3 个回复
坛沤疲撑拆
,
,
和/或
。
我没有尝试运行此代码,因此如果它可能会抱怨某些尺寸。您应该能够弄清楚(这里或那里可能有一些转置)。 只是在旁边提供了一个注释:尽量避免使用短的变量名(当然也不要使用ѭ6等模棱两可的变量名(可能会误读为1,I或l)。此外,如果您对代码进行矢量化处理,可能会更容易首先要有实际的(即未编码的)表达式。 编辑:gnovice建议的应用功能
辅奈
,
和
,则仅使用它们较低三角形部分的值。主对角线上的所有值都将被忽略。通过对向量进行完全矢量化,使其使用矩阵运算而不是循环,您最终将对矩阵的上三角部分进行清零,从而执行不必要的乘法。这是for循环可能是更好选择的情况之一。 因此,这是Egon答案的精炼和更正版本,就执行的数学运算次数而言,应该接近最佳值:
炬卤遁蝎变