Matlab函数句柄优化

ale*_*t87 0 matlab function-handle

我有像Matlab这样的函数句柄

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

A通常在哪里是矩阵.我执行了这么多次,它正在减慢计算速度.可以将它保存为函数句柄(所以我不必重写代码)但是要2*A一劳永逸地计算然后再应用它三次?

提前致谢.

gno*_*ice 6

首先,一个小狡辩:你没有计算2*A3次.你计算它两次并计算2*A.^5一次.请注意,功率运算符优先于乘法运算符.你可以分解它(2*A).*A.^4,但你可能不会为自己节省太多工作.

由于您只限于匿名函数中的单个表达式,因此2*A在这种情况下,我没有特别干净或有效的方法来预计算.相反,您可以将乘法因子移到括号外,以减少您执行的乘法运算量.您可以按如下方式重写您的等式:

fhandle = @(A) 4.*max(0.5 - A,0).*(A.^5 + A + 0.5);
Run Code Online (Sandbox Code Playgroud)

请注意,使用MAX的操作不受在操作之外移动因子2的影响,因为它只是将所有负数元素设置1-2*A为零.从等式的每个部分中移除的因子2导致单个因子4乘以结果,从而将您执行的逐元素乘法的数量减半.

即使你提到不想重写代码,如果效率很关键,你可能想要考虑使用函数子函数而不是匿名函数.根据关于OOP计时的问题的答案中显示的结果,似乎匿名函数可能具有更多开销.对于这么短的功能,重写它不会那么多工作.