2013-11-03 24 views
0

我現在在Matlab中使用fminbnd,我發現它比較慢(我在嵌套循環中使用它)。函數本身,它的接口和它返回的值非常好,但是當查看.m文件時,我發現它沒有被優化。事實上,我希望像這樣的東西寫成一個mex。matlab中有更快的fminbnd版本嗎?

任何人都知道替代fminbnd的工作速度更快,而且沒有太多開銷?

回答

2

它是這樣寫的,因爲它必須在每次迭代中評估(feval)您的用戶定義函數。 Matlab的ODE求解器以相同的方式工作。在當前的Matlab中,C/C++代碼調用用戶定義的Matlab函數並以迭代方式讀取其返回值的代價很高。

確保您正確使用選項,fminbnd是正確的工具(也許更簡單的方案會更好,或者,因爲這在一個循環中,也許多維方法,如fminsearch會更合適),並優化了您的目標功能。下一個最簡單的方法是嘗試將Matlab代碼編譯爲C或C++(請參閱codgen)。您可能需要編譯目標函數和所有選項,以避免上面提到的放緩問題。我還沒有嘗試過fminbnd,但我確實看到了它在線工作的提及。如果你的目標函數本身很複雜,你可以嘗試把它轉換成一個mex函數。

fminbnd基於Brent's method。你可以找到那個here的C,C++和FORTRAN代碼。 GSL也有一個版本:gsl_min_fminimizer_brent

+0

你碰巧知道matlab例程是使用本地還是全局最小化器,如果是後者,它用作二階導數約束? – RDGuida

+0

@RDGuida:'fminbnd'返回一個本地最小值的值(這也在文檔中詳細說明)。如果您需要全局優化方案,那麼您可能需要嘗試[全局優化工具箱](http://go.microsoft.com/fwlink/?LinkId=3705)中提供的[methods](http://www.mathworks.com/help/gads/functionlist.html)中的一個[http://www.mathworks.com/help/gads/functionlist.html] /www.mathworks.com/help/gads/index.html)。 – horchler

相關問題