Оптимизация функции ручки Matlab

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

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

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

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

1 ответ

Во-первых, один маленький спор: вы не работаете 2*A три раза. Вы вычисляете это дважды и вычисляете 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 умножает результат, таким образом вдвое уменьшая количество поэлементных умножений, которые вы выполняете.

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

Другие вопросы по тегам