まあ、私は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);
ここで問題が発生する可能性がありますか?
forループ内でこのアレイスライスに実際にアクセスする必要があるかどうかを示すことができますか?中間変数に代入する必要はありませんか? – nekomatic
私はあなたのクラッシュは、2つのMATLAB変数に同じメモリ領域を割り当てるmexファイルの結果で推測します。 Matlabはこれをしたことを知らず、変数の1つを再割り当てするとクラッシュします。メモリのコピーを避けるには、スライスのコピーを別の変数に作成するのではなく、元の大きなフィールドのインデックスを作成してください。あなたの例のようにインデックス配列を使用することができます。しかし、私は、matlabがデータを内部的にコピーしないことは絶対に確信していません。 –
私はそれを中間変数に割り当てなくても、同じ問題が依然として存在します。その理由は、私はそう思います。論理インデックスを作成するときに、 'size = size([startInd:endInd])'というインデックス配列を作成します。だから私がここでやろうとしているのはちょっとしたハッキングだ。ポインタが存在することを知っているメモリの場所にポインタを置いて、そのメモリの後に取得する要素の数を教えてください。インデックス配列も作成したくありません。 (インデックス配列のサイズは200万のオーダー)。 – Fatih