0

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

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

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

提前致谢。

4

1 回答 1

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);

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

即使您提到不想重写代码,如果效率是关键,您可能需要考虑使用函数子函数而不是匿名函数。根据this answer to an question about OOP timing中显示的结果,匿名函数似乎可能有更多开销。对于这么短的函数,重写它不会有太多的工作。

于 2011-05-23T14:51:18.063 回答