使用mxGetPr与mxGetData

时间:2017-01-25 13:30:10

标签: c++ matlab mex

我正在尝试编写一个简单的mex函数。我有一个整数输入,这是我的对象的数量。 当我编译myMEX_1.cpp并用MATLAB用任何输入值调用它时,我总是得到:

  

请求对象数:= 0

myMEX_2.cpp工作正常并显示从MATLAB命令窗口输入的数字。 我在myMEX_1.cpp的错误在哪里?

我的环境:MATLAB R2013a和Microsoft SDK 7.1编译器。

// myMEX_1.cpp
#include "mex.h" 
void mexFunction(int nlhs,       mxArray *plhs[], 
                 int nrhs, const mxArray *prhs[]) 
{

    char str11[100];
    unsigned short frameCount;
    //unsigned short *frameCountPtr;
    frameCount = (*((unsigned short*)mxGetData(prhs[0])));
    sprintf(str11, "Number of Requested Objects := %d:\n", frameCount);
    mexPrintf(str11);
}





// myMEX_2.cpp
#include "mex.h" 
void mexFunction(int nlhs,       mxArray *plhs[], 
                 int nrhs, const mxArray *prhs[]) 
{
   char str11[100];
   unsigned short frameCount;
   double* dblPointer; 
   dblPointer = mxGetPr(prhs[0]);
   frameCount = (unsigned short)(*dblPointer);
   sprintf(str11, "Number of Requested Objects := %d:\n", frameCount);
   mexPrintf(str11);
}

1 个答案:

答案 0 :(得分:3)

mxGetData返回一个void指针,该指针必须强制转换为正确数据类型的指针。

  

在C中,mxGetData返回void指针(void *)。由于void指针指向没有类型的值,将返回值强制转换为与pm指定的类型匹配的指针类型

在你的情况下,我假设虽然看起来你已经传入一个整数,但它实际上是一个double,因为这是MATLAB的默认数据类型所以你的问题是由于你试图将其转换为unsigned short指针。

myMEX_1(1)          % Passes a double
myMEX_1(uint16(1))  % Passes an integer

要解决此问题,我们需要将mxGetData的输出转换为double指针,然后取消引用,转换并分配

frameCount = (unsigned short)*(double*)mxGetData(prhs[0]);

mxGetPrmxGetData 相同,除了它会自动将mxGetData的输出强制转换为double指针。因此,它为您节省了一个步骤,但仅适用于double输入(您拥有)。

如果要适当处理多种类型的输入,则需要使用mxIsDoublemxIsClass检查输入的类型。

if ( mxIsDouble(prhs[0]) ) {
    frameCount = (unsigned short)*mxGetPr(prhs[0]);
} else if ( mxIsClass(prhs[0], "uint16") {
    frameCount = *(unsigned short*)mxGetData(prhs[0]);
} else {
    mexPrintf("Unknown datatype provided!");
    return;
}