行列から特定の行/列を効率的かつ迅速に削除するためのヒントはありますか?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コードのパフォーマンスが得られますか?
ありがとうございます!
はい、私がmxSetNを使って得ようとしていたパフォーマンスは、最後の列を無視して効果的に削除するということでした。それは作者が示していたようだ。残念ながら、それは私の最後にはうまくいかなかった。最終的には、これを行う最良の方法は 'java.util.ArrayList'だけであると私は思っています。 – genap
さて、あなたはmxSetNでこのアプローチを取ることができます。 mxArrayが実際にクリーンアップされるまでは削除されませんが、MATLABは配列が1つ少ない列を持つように扱います。それについて何がうまくいかなかったのですか?あなたはそれを実行することができないと言った - 問題は何ですか? – CKT