我想改进这个功能,以减少运行时间并优化它。
function [Pl,Plm] = funlegendre(gamma)
Plm = zeros(70,71);
Pl = zeros(70,1);
P0 = 1;
Pl(1) = gamma;
Plm(1,1) = sqrt(1-gamma^2);
for L=2:70
for M=0:L
if(M==0)
if (L==2)
Pl(L) = ((2*L-1)*gamma*Pl(L-1)-(L-1)*P0)/L;
else
Pl(l) = ((2*l-1)*gamma*Pl(l-1)-(l-1)*Pl(l-2))/l;
end
elseif(M<L)
if(L==2)
if(M==1)
Plm(L,M) = (2*L-1)*Plm(1,1)*Pl(L-1);
else
Plm(L,M) = (2*M-1)*Plm(1,1)*Plm(L-1,m-1);
end
else
if(M==1)
Plm(L,M) = Plm(L-2,m) + (2*L-1)*Plm(1,1)*Pl(L-1);
else
Plm(L,m) = Plm(L-2,m) + (2*L-1)*Plm(1,1)*Plm(L-1,M-1);
end
end
elseif(M==L)
Plm(L,M) = (2*L-1)*Plm(1,1)*Plm(L-1,L-1);
else
Plm(L,M) = 0;
end
end
end
Pl = sparse(Pl);
Plm = sparse(Plm);
end发布于 2012-07-12 14:07:03
乍一看,我可以看到几个点,您可以开始优化您的多位数生成。我要重构的第一件事是有条件情况的“大量”使用。只有两种定义良好的情况,即M==0或M==L,因此您可以提取这两种情况,并在外部循环中实现它们。如果您不关心代码的复制、复制/粘贴功能,但是如果您关心的话,您必须编写另一个函数来调用,这可能会再次缓慢。在你提取了两个特例之后,当你让L从1开始,一直跑到L-1的时候,你就不能排除剩下的条件了。另一个优化点是预先计算外部循环中的2*L-1这样的值,以使它们“缓存”以供进一步访问。由于我不确定稀疏矩阵的计算速度是否比完全矩阵快,所以我不确定是否应该从一开始就使用稀疏矩阵,而不是将结果转换为稀疏矩阵。现在,我将尝试将尽可能多的操作向量化,并让高度优化的代码为您完成任务。最后一步,@Elpezmuerto是完全正确的,尝试将其转化为mex函数。这将预编译函数并进一步加快执行时间。
https://codereview.stackexchange.com/questions/2743
复制相似问题