1

MEX を使用して、C++ コードと MATLAB のインターフェイスをとっています。私の C++ コードでは、出力が vector 型である必要があります。私は C++ を初めて使用するので、ポインターがどのように機能するかについて非常に混乱しています。MATLAB から入力配列を取得します

int *data_array_ptr
data_array_ptr=(int *)mxGetData(prhs[0]);
a = mxGetM(prhs[0]);
int int_data[a];
copy(*data_array_ptr, *data_array_ptr+ a, int_data);

ここで、int_data は、data_array_ptr の場所に格納されているすべてのデータを持っているはずです...これを行いますか?

それで、

double *data_out_ptr;

plhs[0]= mxCreateDoubleMatrix( (mwSize)m, (mwSize)n, mxREAL); 
data_out_ptr= mxGetPr(plhs[0]);
len6=mxGetM(plhs[0]);
vector<double> data_out_data(*data_out_ptr,*data_out_ptr+len6);

これにより、空の出力行列の内容が data_out_data という名前のベクトルに配置されます。それはこれをしますか?

次に、data_out_data と int_data の両方を c++ 関数に渡したいと思います。ただし、data_out_data をポインターとして渡したいので、C++ 関数がベクトルにデータを入力し、関数が終了すると、MEX 関数は現在入力されているベクトルを確認し、それを double の配列に変換して戻すことができます。 plhs[0] を埋めることができます。

だから、次のようなもの

mexFunction(plhs[],prhs[]){

int *data_array_ptr
data_array_ptr=(int *)mxGetData(prhs[0]);
a = mxGetM(prhs[0]);
int int_data[a];
copy(*data_array_ptr, *data_array_ptr+ a, int_data);

 double *data_out_ptr;
plhs[0]= mxCreateDoubleMatrix( (mwSize)m, (mwSize)n, mxREAL); 
data_out_ptr= mxGetPr(plhs[0]);
len6=mxGetM(plhs[0]);
vector<double> data_out_data(*data_out_ptr,*data_out_ptr+len6);



foo(int_data, *data_out_data)

copy(data_out_data.begin(), data_out_data.end(), data_out_ptr);
}

foo が返されると、data_out_data が満たされます。私の関数には戻り引数がなく、data_out_data は vector 型でなければなりません。foo がデータを編集できるように、ベクトルを foo に渡すにはどうすればよいですか?

ありがとう!!

4

2 に答える 2

2

あなたの質問を正しく理解しているかどうかわかりません。MATLAB から mex 関数に配列を渡したいと思います。mex 関数は、このデータ配列を操作する C++ 関数を呼び出しますvector。then には、C++ 関数が行うすべてのvector結果が含まれており、このデータを MATLAB に返したいと考えています。


まず、MATLAB から MEX 関数にデータを取得する方法に取り掛かりましょう

int const *data_in = static_cast<int const *>(mxGetData(prhs[0]));

では、data_in渡したデータを指します。ところで、配列にints が含まれていることは確かですか? 既定では、MATLAB はすべてに を使用doubleします。

C++ 関数はこの配列を変更しますか? そうでない場合は、コピーを実行する代わりに、ポインターと要素の数を使用して呼び出すことができます。

たとえば、の署名foo

foo( int const *data_in, mwSize num_data_in, std::vector<double> *data_out );

あなたはそれを次のように呼び出すことができます

foo( data_in, mxGetNumberOfElements(prhs[0]), &data_out );

データを変更する必要がある場合、および/または を変更できない場合fooは、データのコピーを保持するベクトルを作成するだけです。

std::vector<int> data_in_vec( data_in, data_in + mxGetNumberOfElements(prhs[0]) );
foo( data_in_vec.data(), data_out );

関数に関してfooは、呼び出す前にベクトルのサイズを正しくする必要がありますか? もしそうなら、

std::vector<double> data_out( m * n );  // creates a vector with m * n elements
foo( data_in_vec.data(), &data_out );

可能であれば、の代わりにfooを受け入れるように変更します。次に、次のように呼び出すことができますstd::vector<double>&std::vector<double> *

foo( data_in_vec.data(), data_out );

また、選択肢があればfoo、呼び出し元に要求するのではなく、必要に応じてベクトルのサイズを変更する必要がありました。


ここで、データを MATLAB に戻します。

plhs[0] = mxCreateDoubleMatrix( m, n, mxReal );
std::copy( data_out.data(), data_out.data() + data_out.size(), mxGetPr(plhs[0]) );

上記の行は、ベクトルのサイズが次の値以下であることを前提としていますm * n

C や C++ とは異なり、MATLAB は行列を列優先の形式で格納することに注意してください。関数の動作によってはfoo、返されたベクトルを転置する必要がある場合があります。その場合std::copy、コピーを行うために使用できないため、ネストされたループを記述する必要があります。

于 2012-08-08T23:20:51.347 に答える