我在 Matlab 中有一个这样的函数句柄
fhandle = @(A) max(1-2*A,0).*(2*A.^5+2*A + 1)
WhereA
通常是一个矩阵。我执行了很多次,它减慢了计算速度。可以将其保留为函数句柄(因此我不必重写代码)而是2*A
一劳永逸地计算然后应用它三次?
提前致谢。
我在 Matlab 中有一个这样的函数句柄
fhandle = @(A) max(1-2*A,0).*(2*A.^5+2*A + 1)
WhereA
通常是一个矩阵。我执行了很多次,它减慢了计算速度。可以将其保留为函数句柄(因此我不必重写代码)而是2*A
一劳永逸地计算然后应用它三次?
提前致谢。
首先,一个小问题:你没有计算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,从而将您执行的逐元素乘法的数量减半。
即使您提到不想重写代码,如果效率是关键,您可能需要考虑使用函数或子函数而不是匿名函数。根据this answer to an question about OOP timing中显示的结果,匿名函数似乎可能有更多开销。对于这么短的函数,重写它不会有太多的工作。