2016-06-15 124 views
0

有效快速地從Matrix中刪除給定行/列的任何提示?有效刪除MATLAB中的矩陣行/列

我最初認爲刪除給定矩陣的最後一列會比第一列更有效率,並且所有列操作比行操作(給出MATLAB的基於列的內存)更有效率,我能夠通過測試確認。然而,我所獲得的表現相當不幸。

someB = rand(4,50000); 
someC = someB.'; 

tic 
while size(someB,2) > 2 
    someB(:,size(someB,2)) = []; 
end 
toc 

tic 
while size(someC,1) > 2 
    someC(size(someC,1),:) = []; 
end 
toc 

%Elapsed time is 13.869280 seconds. 
%Elapsed time is 10.198270 seconds. 

我做了快速搜索,並在this MATLAB newsgroup discussion我發現,希望通過外部C MEX功能有可能確實是一種有效地快速刪除矩陣的最後一列。代碼附在下面。

#include "mex.h" 

// You may need to uncomment the next line 
//#define mwSize int 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
    mwSize n; 
    if(n = mxGetN(prhs[0])) 
     mxSetN(prhs[0], n - 1); 
} 

但是,我無法讓自己的代碼運行。如果您快速瀏覽作者發現的結果,您會發現相當出色的表現。我自己對MEX不太擅長;任何人都知道如何修正上面的代碼,以便它運行,或者,有一個同樣/幾乎同樣好的MEX代碼/ MATLAB代碼的性能?

謝謝!

回答

0

嗯,其中之一,您發佈的MEX解決方案實際上並不是刪除的列,所以這不是一個真正公平的比較。使用「mxSetN」的解決方案只是將mxArray的內部頭設置爲認爲它具有N列。從文檔:

您通常使用mxSetN來更改現有的mxArray的形狀。 mxSetN函數不會爲pr,pi,ir或jc數組分配或取消分配任何空間。

關於你看到的時間結果,如果你多次運行這個,會發生什麼?我第一次跑這個時,我的結果與你的結果相似,但在第二次運行時,兩種方法的時間都相似。

請記住,在任何情況下,您都必須重新分配大量內存,因爲您一次只能刪除4個元素。這意味着較早的循環迭代將比以後的迭代花費更多。

這裏最大的問題就是你最終想做什麼。也許你可以避免刪除,只使用你需要的矩陣部分,或者有一些方法可以避免在每次迭代時刪除單個列(而是多列)。

+0

是的,我希望用mxSetN得到的性能是它會簡單地忽略最後一列,並有效地刪除它;這似乎是作者所說的。不幸的是,它並沒有解決我的問題。最終,我認爲這樣做的最好方法可能只是一個'java.util.ArrayList'。 – genap

+0

那麼,你可以採用mxSetN的方法,它會這樣做。它不會刪除它,直到mxArray實際得到清理,但MATLAB會將該數組視爲它有一個較少的列。什麼沒有解決這個問題?你說你不能讓它運行 - 問題是什麼? – CKT