1

ねえ、私はmatlabの引数を介してmex-functionに渡されたデータにアクセスする方法を本当に理解していません。私が「デフォルト」ゲートウェイ機能を持っていると仮定します

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )

そして今、私は1.入力引数へのポインタを取得します。

double* data_in;
data_in = mxGetPr(prhs[0]);

次の両方の行は、それぞれ別々に私のmatlabをクラッシュさせます。

mexPrintf("%d", *data_in);
mexPrintf("%d", data_in[1]);

しかし、data_inが明らかに最初の引数へのポインターであるのに、なぜそのようなデータにアクセスできないのでしょうか。

  1. いつポインタをdouble*として宣言する必要があり、いつmxArray *として宣言する必要がありますか?時々私はそのようなものを見ます:mxArray * arr = mxCreateDoubleMatrix(n、m、mxREAL);!?

よろしくお願いします!

4

2 に答える 2

5

data_inはへのポインタdoubleなので、次のようなものが必要です

mexPrintf("%f", data_in[0]);

これは、呼び出し元がサイズ>0のベクトルまたは行列を渡したと想定しています。

より一般的には、

int n = mxGetN(array);
int m = mxGetM(array);

mex関数に渡される行列/ベクトルの行と列の数を取得します。

についてmxArray

Matlabは、その行列(複素数と実数)をmxArray構造体にパックします。mxCreateDoubleMatrixそのような構造へのポインタを返します。そのデータに実際にアクセスするには、実数部にmxGetPr()を使用し、虚数部にmxGetPi()を使用する必要があります。

これらは、割り当てられたdouble[]配列へのポインタを返します。これを使用して、行列の要素にアクセス(読み取りおよび書き込み)できます。

于 2011-04-28T09:39:11.333 に答える
2

mxArraysの次元を処理する非常に便利な方法は、次のような関数を導入することです。

#include <cstddef>
#include <cstdarg>
#include "mex.h"

bool mxCheckDimensions(const mxArray* mx_array, size_t n_dim,...) {
    va_list ap;             /* varargs list traverser */

    size_t *dims;           /* dimension list */
    size_t i;
    size_t dim;
    bool retval = true;

    va_start(ap,n_dim);
    dims = (size_t *) malloc(n_dim*sizeof(size_t));

    for(i=0;i<n_dim;i++) {
        dims[i] = va_arg(ap,size_t);
        dim  = mxGetDimensions(mx_array)[i];
        if (dim != dims[i])
            retval = false;
    }

    va_end(ap);
    free(dims);

    return retval;
}

このようにして、配列をチェックしますmxArray * pは、サイズが1,3のdouble配列です。

double* pDouble = NULL;

if (mxIsDouble(p)) {
    if (mxCheckDimensions(p, 2, 1, 3)) {
        pDouble = (double*) GetData(p);
        // Do whatever
    }
}`
于 2014-01-27T21:25:14.697 に答える