2016-06-15 7 views
0

行列から特定の行/列を効率的かつ迅速に削除するためのヒントはありますか?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配列の領域を割り当てたり割り当てを解除したりしません。

あなたが見ているタイミング結果に関して、これを複数回実行するとどうなりますか?これを初めて実行したとき、私はあなたに似た結果を得ましたが、2回目の実行では両方の方法でタイミングが似ていました。

いずれの場合でも、一度に4つの要素を削除するだけなので、大量のメモリを再割り当てする必要があります。これは、初期のループ反復では後の反復よりもコストがかかることを意味します。

ここで大きな問題は、あなたが最終的にしようとしていることです。たぶん、削除を避け、必要な行列の部分だけを使用するか、各繰り返しで1つの列を削除しなくても、複数の列を実行する必要がないようにする方法があります。

+0

はい、私がmxSetNを使って得ようとしていたパフォーマンスは、最後の列を無視して効果的に削除するということでした。それは作者が示していたようだ。残念ながら、それは私の最後にはうまくいかなかった。最終的には、これを行う最良の方法は 'java.util.ArrayList'だけであると私は思っています。 – genap

+0

さて、あなたはmxSetNでこのアプローチを取ることができます。 mxArrayが実際にクリーンアップされるまでは削除されませんが、MATLABは配列が1つ少ない列を持つように扱います。それについて何がうまくいかなかったのですか?あなたはそれを実行することができないと言った - 問題は何ですか? – CKT

関連する問題