3

mexライブラリにすべてのメモリ割り当てを回避させようとしています。
これまで、mexは入力を取得し、を使用していくつかの行列を作成しmxCreate...()、この出力を返していました。
しかし、ここで、mex自体が割り当てを行わないように、このインターフェイスを変更したいと思います。
私が念頭に置いていたのは、mexFunctionが入力として行列を取得して値を入力し、これとまったく同じ行列を出力として返すことです。

これは可能でしょうか?

これが私がしなければならないことであるかどうかを私に考えさせたわずかな警告は、左側の引数がconstとしてmexFunctionに来て、右側の引数が非constであるということです。入力行列を出力として返すには、この定数を削除する必要があります。

4

2 に答える 2

5

右側の引数を変更するのは悪い考えです。これらの入力は参照カウントできます。参照カウントが1より大きい場合にそれらを変更すると、他の変数に格納されている値もサイレントに変更されます。

残念ながら、既存のMEX APIを使用して、必要なことを実行する方法はないと思います。

于 2009-11-11T00:18:57.203 に答える
5

おかしなことに、私は先日これを見ていました。私が見つけた最高の情報は、ここここ、そしてこれもスレッドでした。

基本的に、Matlabの世界では一般的に非常に悪いことと見なされています...しかし同時に、それを実行できるように停止するものは何もありません-いくつかの簡単な例を試してみると、変更が伝播されていることがわかります。prhsから取得したデータに変更を加えるだけです(何も返す必要はありません。生データを変更したため、ワークスペースの変数に反映されます)。

ただし、リンクで指摘されているように、Matlabsのコピーオンライトのセマンティクスのため、これは奇妙な結果をもたらす可能性があります。設定format debugは、これを直感的に理解するのに大いに役立ちます。そうするとa=b、aとbの「構造アドレス」またはヘッダーが異なり、それらが異なる変数であるという事実を表しますが、データポインターprはメモリ内の同じ領域を指します。通常、Matlabでyを変更すると、コピーオンライトが開始され、変更前にデータ領域がコピーされるため、yの後に新しいデータポインターが作成されます。mexで物事を変更しても、これは発生しないため、yを変更すると、xも変更されます。

大規模なデータセットを処理する必要がある場合は非常に便利ですが、奇妙なことに注意する必要があります。入力するデータが変数間で共有されないようにしてください。構造体配列とセル配列では事態はさらに複雑になるので、それらにそれを行わないようにする傾向があります。

于 2009-11-12T01:05:04.113 に答える