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

  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* pDouble = NULL;

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