3

私は現在、MATLABのセル配列で動作する必要があるMEX関数を作成しています。MEXファイルはCで書かれています。

基本的に、私の関数への入力は、各エントリが実数値の数値行列であるセル配列になります。簡単な例は次のとおりです。

C = cell(1,2);
C{1} = ones(10,10);
C{2} = zeros(10,4);

MEXファイルの数値配列C{1}およびC{2}にアクセスできるようにしたいと思います。理想的には、MEXファイルにデータの2番目のコピーを作成せずにこれを実行したいと思います(つまり、それらのポインターを取得します)。

前の例を使用すると、現在のアプローチは次のとおりです。

/* declare a pointer variable to the incoming cell array after it is passed to the MEX function */
mxArray C_CELL = (mxArray *) mxGetData(prhs[0]) 

/* declare  a 2 x 1 array of pointers to access the cell array in C */
double *myarray[2] //

/* point towards the contents of C_CELL */
myarray[0] = mxGetPr(C_CELL[0])
myarray[1] = mxGetPr(C_CELL[1])

残念ながら、これにより「未定義の型'structmxArray_tag'の無効な使用」エラーが発生するようです。

4

2 に答える 2

6

mxGetCellセル配列の内容を抽出するためにを使用する必要があります。

mxArray *cellArray[2];
cellArray[0] = mxGetCell(prhs[0], 0);
cellArray[1] = mxGetCell(prhs[0], 1);
于 2012-04-16T18:41:27.853 に答える
4

そのコードサンプルには多くの問題があります。

  • すべての行に末尾のセミコロンがありません
  • mxArraysはポインタとして定義する必要があります:例:mxArray *C_CELL

しかし、表示されるエラーメッセージに基づいて、使用しているソースでこれらのアイテムが正しいと思います。

主な問題は、の出力をに割り当てていることmxGetDataですmxArray *。動作する方法は、マトリックスの内容への生の()ポインターをmxGetData返すことです。void *この場合、マトリックスには、mxArray2つのレベルのポインターリダイレクトを含むポインターの配列が含まれています。

そのため、としてC_CELL定義する必要がありますmxArray **C_CELL。健全性チェックまたは境界チェックなしでこれを行うと、すぐにセグフォールトが発生することに注意してください。mxGetCell@David Heffernanが示唆するように使用することは、これを行うためのより安全で確実な方法です(セル配列が含まれていることを確認したと仮定します)prhs[0]

于 2012-04-16T18:49:13.417 に答える