首页 文章

matlab mex:访问数据

提问于
浏览
1

嘿那里,我真的不明白如何访问通过matlab中的参数传递给mex函数的数据 . 假设我有'默认'网关功能

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显然是指向第一个参数的指针时,为什么我不能访问数据呢?

  • 我什么时候需要将指针声明为double *,何时声明为mxArray *?有时我会看到类似的东西:mxArray * arr = mxCreateDoubleMatrix(n,m,mxREAL);!?

非常感谢提前!

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[] 数组的指针,您可以使用它们来访问(读取和写入)矩阵的元素 .

  • 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* pDouble = NULL;
    
    if (mxIsDouble(p)) {
        if (mxCheckDimensions(p, 2, 1, 3)) {
            pDouble = (double*) GetData(p);
            // Do whatever
        }
    }`
    

相关问题