2009-11-10 122 views
3

我試圖讓我的mex庫避免所有的內存分配甚至如此。
直到現在,mex得到了一個輸入,使用mxCreate...()創建了一些矩陣並返回了這個輸出。
但現在我想修改這個接口,以便mex本身不會做任何分配。
我想到的是,mexFunction將得到作爲輸入的矩陣來填充值並返回與輸出相同的矩陣。Matlab:避免mex中的內存分配

這應該是可能的嗎?

讓我想到,如果這是我需要做的所有事情的輕微警告是,左手參數來作爲const的mexFunction和右手參數是非const。將輸入矩陣作爲輸出返回,我需要刪除這個常量。

回答

5

有趣的是,我前幾天只是看着這個。我發現的最佳信息是線索herehere以及this

基本上它在Matlab世界中通常被認爲是一件非常糟糕的事情......但與此同時,沒有任何東西可以阻止你,所以你可以做到這一點 - 嘗試一些簡單的例子,你會看到變化被傳播。只需更改從prhs獲得的數據(您不需要返回任何內容 - 因爲您更改了原始數據,它將反映在工作區中的變量中)。

但正如鏈接中指出的那樣,由於Matlabs寫時複製語義,這可能會產生奇怪的後果。設置format debug可以在這方面獲得直覺。如果你做了a=b那麼你會看到a和b有不同的'結構地址'或標題,表示它們是不同的變量,但數據指針pr指向內存中的同一區域。通常情況下,如果在Matlab中更改y,則寫入時複製將啓動並且數據區在被更改之前被複制,因此在y有新的數據指針之後。當你用mex改變事物時,這不會發生,所以如果你改變了y,x也會改變。

我認爲可以這麼做 - 如果您需要處理大型數據集,但您需要留意任何不尋常的情況,這是非常有用的 - 儘量確保您輸入的數據不會在變量之間共享。結構和單元陣列變得更加複雜,所以我更傾向於避免這樣做。

5

修改右邊的參數將是一個壞主意。這些輸入可以被引用計數,並且如果在引用計數大於1時修改它們,那麼您將默默修改存儲在其他變量中的值。

不幸的是,我不相信有一種方法可以根據現有的MEX API做你想要的。

+0

有''extern bool mxUnshareArray(mxArray * array_ptr,bool noDeepCopy);'應該解決那些耦合問題的未公開的matlab函數(在C中可用)。詳情可以在[here]找到(http://www.mk.tu-berlin.de/Members/Benjamin/mex_sharedArrays)。 – 2013-02-20 11:45:59