matlab mex:访问数据

Posted

技术标签:

【中文标题】matlab mex:访问数据【英文标题】:matlab mex: Access data 【发布时间】:2011-04-28 09:24:26 【问题描述】:

你好, 我真的不明白如何访问通过 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);!?

提前非常感谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

是的,我也是这么想的,但是当我在 mexfile 中使用 mexPrintf("%f", data_in1[0]); 时,它会使 matlab 崩溃...:“--------------- -------------------------------------------------- ------- 2011 年 4 月 28 日星期四 11:45:00 检测到分段违规 ------------------------------ ------------------------------------------" @bjoern:确保从 mxGetPr 返回的指针不为 NULL (0) 并且 mxGetN 和 mxGetM 返回数字 >= 1 好的,谢谢,现在效果很好!但我还有一个问题:假设我通过 myfunction([1:2; 3:4]) 传递一个矩阵,我想知道为什么我不能访问这样的数据(在in = mxGetPr(prhs[0]); 之后):mexPrintf("%f", in[0][0]);,而不是对此,我必须使用像这样的“单”索引:in[3] 将返回 4,而 in[0] 将返回 1。为什么不再像 in[n][m] 这样的“明显”双索引? @bjoern:只有当编译器在编译时知道每行的列数时,您才能使用 x[row][column] 表示法访问 C 中的数组(因此它可以将其重写为 x [行*elelemnts_per_row + 列])。由于事先不知道 Matlab 数组的维数,因此不能使用 x[][] 表示法。如果您正在编写 c++,您可以将 mx_array 包装在一个类中并污染一个合适的 operator() 以便您可以访问 x(row, col) 之类的元素。 所以这真的是应有的行为吗? :)【参考方案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
    
`

【讨论】:

以上是关于matlab mex:访问数据的主要内容,如果未能解决你的问题,请参考以下文章

mex 编译错误:Matlab 数据类型和函数的预期表达式错误

如何使用用户预定义的数据设置 mwArray?是不是可以混合使用 Matlab 库编译器和 mex 运行时?

如何在从 Matlab 调用的 mex 函数中使用 Matlab 引擎

如何访问传递给 MEX 函数的矩阵成员?

Matlab MEX-函数副作用

网关功能缺失 -->Matlab 2018a -->Mex