首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Legendre多项式与函数

Legendre多项式与函数
EN

Code Review用户
提问于 2011-05-31 19:14:06
回答 1查看 1.3K关注 0票数 4

我想改进这个功能,以减少运行时间并优化它。

代码语言:javascript
复制
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
EN

回答 1

Code Review用户

回答已采纳

发布于 2012-07-12 14:07:03

乍一看,我可以看到几个点,您可以开始优化您的多位数生成。我要重构的第一件事是有条件情况的“大量”使用。只有两种定义良好的情况,即M==0或M==L,因此您可以提取这两种情况,并在外部循环中实现它们。如果您不关心代码的复制、复制/粘贴功能,但是如果您关心的话,您必须编写另一个函数来调用,这可能会再次缓慢。在你提取了两个特例之后,当你让L从1开始,一直跑到L-1的时候,你就不能排除剩下的条件了。另一个优化点是预先计算外部循环中的2*L-1这样的值,以使它们“缓存”以供进一步访问。由于我不确定稀疏矩阵的计算速度是否比完全矩阵快,所以我不确定是否应该从一开始就使用稀疏矩阵,而不是将结果转换为稀疏矩阵。现在,我将尝试将尽可能多的操作向量化,并让高度优化的代码为您完成任务。最后一步,@Elpezmuerto是完全正确的,尝试将其转化为mex函数。这将预编译函数并进一步加快执行时间。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/2743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档