Matlab函数句柄优化

时间:2011-05-23 14:28:53

标签: matlab function-handle

我在Matlab中有一个像这样的函数句柄

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

A通常是矩阵。我执行了这么多次,它正在减慢计算速度。可以将它保留为函数句柄(因此我不必重写代码),而是一劳永逸地计算2*A然后将其应用三次?

提前致谢。

1 个答案:

答案 0 :(得分:6)

首先,一个小狡辩:你没有计算2*A 3次。你计算它两次并计算2*A.^5一次。请注意power operators take precedence over multiplication operators。您可能将其分解为(2*A).*A.^4,但您可能无法为自己节省太多工作。

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

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

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

即使您提到不想重写代码,如果效率很关键,您可能还需要考虑使用functionsubfunction而不是匿名函数。根据{{​​3}}中显示的结果,似乎匿名函数可能会有更多的开销。对于这么短的功能,重写它不会那么多工作。