Оптимизация функции ручки Matlab - PullRequest
0 голосов
/ 23 мая 2011

У меня есть дескриптор функции в Matlab, как это

fhandle = @(A) max(1-2*A,0).*(2*A.^5+2*A + 1)

Где A - это обычно матрица. Я делаю это довольно много раз, и это замедляет вычисления. Можно сохранить его как дескриптор функции (поэтому мне не нужно переписывать код), но можно вычислить 2*A раз и навсегда, а затем применить его три раза?

Заранее спасибо.

1 Ответ

6 голосов
/ 23 мая 2011

Во-первых, одно маленькое замечание: вы не вычисляете 2*A 3 раза.Вы вычисляете это дважды и вычисляете 2*A.^5 один раз.Обратите внимание, что операторы мощности имеют приоритет над операторами умножения .Вы могли бы разбить его на (2*A).*A.^4, но вы не могли бы сэкономить себе много работы.

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

fhandle = @(A) 4.*max(0.5 - A,0).*(A.^5 + A + 0.5);

Обратите внимание, что на вашу операцию с использованием MAX не повлияет перемещение коэффициента 2 за пределы операции, поскольку она просто устанавливает все отрицательные значения.элементы от 1-2*A до нуля.Коэффициенты 2, удаленные из каждой части уравнения, приводят к умножению результата на один коэффициент 4, уменьшая вдвое количество поэлементных умножений, которые вы выполняете.

Даже если вы упомянули, что не хотите переписывать кодВозможно, вы захотите использовать функцию или подфункцию вместо анонимной функции, если эффективность является ключевым фактором.На основании результатов, показанных в этого ответа на вопрос о сроках OOP , кажется, что у анонимных функций могут быть дополнительные издержки.И для такой короткой функции переписать это не так уж много работы.

...