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 运行时?