Оптимизация функции подбора ряда Фурье Matlab

Я пытаюсь перебрать набор образцов, которые, кажется, показывают периодические изменения. Мне нужно постоянно применять функцию подгонки, чтобы получить коэффициенты ряда Фурье, регрессия должна состоять из n выборок в прошлом (в моем случае около 30). Проблема в том, что мой код очень медленный! Это займет около 1 часа для набора из 50 000 образцов. Есть ли способ оптимизировать это? Что я делаю неправильно?

Вот мой код:

function[coefnames,coef] = fourier_regression(vect_waves,n)        

    j = 1;
    coef = zeros(length(vect_waves)-n,10);

    for i=n+1:length(vect_waves)

        take_fourier = vect_waves(i-n+1:i);
        x = 1:n;
        f = fit(x,take_fourier,'fourier4');
        current_coef = coeffvalues(f);
        coef(j,1:length(current_coef)) = current_coef;
        j = j + 1;



    end
    coefnames = coeffnames(f);

end

Когда я вызываю [coefnames,coef] = fourier_regression(VECTOR,30);, для вычисления требуется вечность. Есть ли способ это исправить? Что не так с моим кодом?

Примечание. У меня процессор Intel i7 5500 U, 16 ГБ ОЗУ и я использую Matlab 2015a.


person Luis Cruz    schedule 27.10.2015    source источник
comment
Откуда coeffnames? Вы не определяете его до того, как назовете его в предпоследней строке. Я предлагаю вам также указать, что содержится в vect_waves, то есть какие числа и, возможно, опубликовать первые 10 или около того строк, чтобы мы могли сами попробовать код. Также, пожалуйста, напишите, какая у вас система: ЦП, ОЗУ, ОС, версия MATLAB, чтобы мы могли видеть, связано ли это с аппаратным/программным обеспечением.   -  person Adriaan    schedule 27.10.2015
comment
Coeffnames происходит от fit, он автоматически задается Matlab, когда вы вызываете fit с помощью Фурье. vect_waves — это в значительной степени вектор с 500 тыс. выборок, содержащих сигнал, вот и все (куча чисел между [-1,1]). Я разместил больше информации о моем оборудовании на почте.   -  person Luis Cruz    schedule 27.10.2015
comment
Так что в основном это ВЕСЬ код, который у меня есть.   -  person Luis Cruz    schedule 27.10.2015


Ответы (1)


Поскольку я не знаком с вашим приложением, я не уверен, можно ли векторизовать код для повышения производительности. Однако у меня есть еще пара советов.

Одна вещь, которую вы должны учитывать, это предварительное выделение массивов. В этом случае вы должны предварительно выделить как минимум массив coef, так как я полагаю, что вы знаете его размер перед запуском цикла.

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

person mikkola    schedule 27.10.2015
comment
Я пробовал предварительно выделять массивы, но в этом случае это совсем не помогло. Я не уверен, можно ли будет векторизовать мой код, так как мне нужно использовать функцию подгонки N раз, а не только один раз. Я предполагаю, что функция подгонки просто медленная, поэтому я мог бы подумать о написании собственной функции для получения коэффициентов ряда Фурье, но просто хотел убедиться, что я мог бы сделать что-то еще вместо этого... - person Luis Cruz; 27.10.2015