2013-07-24 67 views
0

我正在計算一個Matlab中的統計模型,它必須每次迭代運行約200卡爾曼濾波器,並且我想迭代modelat至少10000次,這表明我應該在最少200萬次。因此,我正在尋找一種方法來優化這部分Matlab的計算速度。我已經完成了每個操作的操作,嘗試使用所有可用的技巧來優化Matlab中的計算,但是我想走得更遠...在Matlab中改進卡爾曼濾波器的計算速度

我不熟悉C/C++,但是我讀了mex -file在某些情況下可能有用。任何人都可以告訴我它是否值得進入這個方向? 謝謝...

+0

使用mex文件*可以更快,但前提是您知道如何編寫出色的C代碼。優化m文件的許多時間更加容易和更快(實現和運行時間)。發佈您的m代碼,您可能會收到有用的評論。 – shoelzer

回答

0

寫入mex文件一定會加快整個過程,但是你將無法使用很多內置的MATLAB函數。你只限於你可以用C++和C做什麼。當然你可以編寫自己的函數,只要你知道如何。

速度的增加主要來自mex文件編譯的事實,不像標準MATLAB腳本一樣逐行解釋。一旦你編譯mex,你可以像使用其他MATLAB函數一樣調用它。

對於我上大學的班級,我不得不編寫自己的圖片縮放功能,我最初是用標準腳本編寫的,需要幾秒鐘才能完成大圖片,但是當我用C編寫時在mex中它會在不到0.1秒的時間內完成。

MEX Files Documentation

0

如果你不熟悉,在所有C/C++這將是慘淡經營。希望你有除了Matlab以外的另一種語言的一些經驗?您可以嘗試從衆多的included examples中學習/複製,但您需要先確定基本知識。

有一點特別。如果你使用mex,你需要一些方法來獲得適合你的卡爾曼濾波器噪聲的體面隨機數。你可能會感到驚訝,但是很大一部分計算時間可能會產生噪聲的隨機數(取決於你的濾波器的複雜度可能> 50%)。

不要在C/C++中使用默認的隨機數生成器。

這些不適合科學計算,特別是當您需要生成大量值時。您的第一個選擇是將通過Matlab中的randn生成的大量隨機數傳遞給您的mex代碼。或者查看包含C代碼Mersenne Twister算法本身並查找/實現用於從統一的隨機數產生正態隨機數的方案(log-polar最簡單,但Ziggurat會更快)。這並不難。我自己做過,而且它的實際速度比Matlab當前實現的均勻變量快2倍以上。

0

通常可以使用parfor循環或並行計算工具箱來加速計算。你已經檢查過MATLAB是否使用100%的CPU?