Полиномы и функции Лежандра


Я хотел бы улучшить эту функцию, чтобы сократить время выполнения и оптимизировать его.

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


1420
3
задан 31 мая 2011 в 07:05 Источник Поделиться
Комментарии
1 ответ

На первый взгляд я вижу несколько точек, где вы можете начать оптимизировать ваше поколение полином.
Первым делом я бы рефакторинг-это "тяжелые" использование условных случаях. Есть только два четко определены ситуации, в которых M==0 или M==л. Таким образом, вы могли бы извлечь обоих случаях и выполнять их в пределах внешнего контура. Если вам не нравится дублирование кода копировать/вставить функциональность, но если вы заботитесь вы должны написать другую функцию для вызова, который может быть снова медленно. После того, как вы добыли два особых случаях вы можите опустить остальные состояния, когда вы позвольте мне начинать с 1 и до Л-1. Другая точка оптимизации для предварительного вычисления значений, как 2*л-1 во внешнем цикле, то их "кэшированные" для дальнейшего доступа. А я не уверен, если разреженных матриц являются вычислительно быстрее, чем полные Матрицы я не уверен, если я должен рекомендовать использовать их с самого начала и не конвертировать результаты в разреженными матрицами. Сейчас я попытаюсь собрать столько операций, сколько возможно, и пусть оптимизированный код делает работу за вас.
И на последнем шаге @Elpezmuerto полностью право попытаться превратить его в функцию мекс. Это будет скомпилировать функцию и ускорить время выполнения еще больше.

2
ответ дан 12 июля 2012 в 02:07 Источник Поделиться