2017-11-29 3 views
2

まあ、私はMatlabでアルゴリズムを実装しようとしています。 forループ内に高次元配列のスライスを使用する必要があります。論理インデックスを使用しようとすると、Matlabはそのスライスの追加コピーを作成し、配列が膨大なので、時間がかかります。Matlabで追加のメモリを使わずにサブアレイを作成できますか?

slice = x(startInd:endInd); 

私がしようとしているのは、そのスライスをコピーせずに使用することです。線形演算子を入力するにはスライスデータが必要です。私は反復中にその部分を更新しません。

これを行うには、出力がダブル 型の配列であり、そのサイズが目的のスライスデータサイズと等しいMexファイルを書き込もうとしました。

plhs[0] = mxCreateUninitNumericMatrix(0, 0, mxDOUBLE_CLASS,mxREAL); % initialize but do not allocate any additional memory 
ptr1 = mxGetPr(prhs[0]); % get the pointer of the input data 

次に、出力のポインタを入力データの開始インデックスに設定します。

mxSetPr(plhs[0], ptr1+startInd); 
mxSetM(plhs[0], 1); 
mxSetN(plhs[0], (endInd-startInd)); % Update the dimensions as intended 

開始インデックスをゼロに設定すると、正常に動作します。 に0以外の値を指定しようとすると、Mexファイルはエラーなしでコンパイルされますが、Mex関数が呼び出されるとMatlabがクラッシュします。

slice = mex_slicer(x, startInd, endInd); 

ここで問題が発生する可能性がありますか?

+0

forループ内でこのアレイスライスに実際にアクセスする必要があるかどうかを示すことができますか?中間変数に代入する必要はありませんか? – nekomatic

+0

私はあなたのクラッシュは、2つのMATLAB変数に同じメモリ領域を割り当てるmexファイルの結果で推測します。 Matlabはこれをしたことを知らず、変数の1つを再割り当てするとクラッシュします。メモリのコピーを避けるには、スライスのコピーを別の変数に作成するのではなく、元の大きなフィールドのインデックスを作成してください。あなたの例のようにインデックス配列を使用することができます。しかし、私は、matlabがデータを内部的にコピーしないことは絶対に確信していません。 –

+0

私はそれを中間変数に割り当てなくても、同じ問題が依然として存在します。その理由は、私はそう思います。論理インデックスを作成するときに、 'size = size([startInd:endInd])'というインデックス配列を作成します。だから私がここでやろうとしているのはちょっとしたハッキン​​グだ。ポインタが存在することを知っているメモリの場所にポインタを置いて、そのメモリの後に取得する要素の数を教えてください。インデックス配列も作成したくありません。 (インデックス配列のサイズは200万のオーダー)。 – Fatih

答えて

0

データポインタを配列に割り当てる方法は、配列が削除されたとき、または別のものが割り当てられているときにMATLABがそのメモリを解放しようとすることを意味します。 mallocで取得できなかったポインタを使用してfreeを呼び出そうとすると、クラッシュする可能性があります。

残念ながら、MATLABは、異なる配列の部分を指す配列である「ビュー」をサポートしていません。だからあなたがしたいことをする方法はありません。それは(例えば、小さなアレイで)インデックスにできるだけ多くの時間を取らないように、異なったデータ

  • 店舗:

    代替ソリューションはにだろうか?

  • 大規模なデータブロックの部分範囲を非常に簡単に指すことができるMEXファイル内で、CまたはC++ですべての計算を実行します。

関連する問題