2011-05-23 149 views
0

我在Matlab中的函數處理這樣MATLAB函數句柄優化

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

哪裏A通常是一個矩陣。我這樣做了很多次,並且正在減慢計算速度。可以將它保留爲函數句柄(所以我不必重寫代碼),但是要一勞永逸地計算2*A,然後將它應用三次?

在此先感謝。

+0

您是否在循環中使用它? A'每次都改變還是固定? – abcd 2011-05-23 14:51:34

回答

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,而不是匿名函數。基於this answer to a question about OOP timing中顯示的結果,看起來匿名函數可能會有更多開銷。而對於這樣一個短暫的功能,重寫它並不是那麼多功夫。