开发者

Matlab function handle optimizing

开发者 https://www.devze.com 2023-03-08 00:26 出处:网络
I have a function handle in Matlab like this fhandle = @(A) max(1-2*A,0).*(2*A.^5+2*A + 1) Where A开发者_Python百科 is typically a matrix. I perform this quite a few times and it is slowing down the

I have a function handle in Matlab like this

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

Where A开发者_Python百科 is typically a matrix. I perform this quite a few times and it is slowing down the computation. It is possible to keep it as a function handle (so I don't have to rewrite code) but to compute 2*A once and for all and then apply it the three times?

Thanks in advance.


First, one small quibble: you're not computing 2*A 3 times. You're computing it twice and computing 2*A.^5 once. Note that power operators take precedence over multiplication operators. You could break it up as (2*A).*A.^4, but you might not be saving yourself much work.

Since you are limited to a single expression inside an anonymous function, there are no particularly clean or efficient ways I can think of to precompute 2*A in this case. Instead, you could just move the multiplicative factors outside the parentheses to reduce the amount of multiplications you perform. You can rewrite your equation as follows:

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

Note that your operation using MAX will be unaffected by moving the factor of 2 outside the operation, since it is simply setting all the negative elements of 1-2*A to zero. The factors of 2 removed from each part of the equation result in a single factor of 4 multiplying the result, thus halving the number of element-wise multiplications you perform.

Even though you mention not wanting to rewrite the code, you might want to consider using a function or subfunction instead of an anonymous function if efficiency is key. Based on the results shown in this answer to a question about OOP timing, it appears that anonymous functions may have more overhead. And for such a short function, rewriting it wouldn't be that much work.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号