使用 mxGetPr 与 mxGetData

Using mxGetPr vs mxGetData

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

Number of Requested Objects := 0

但是 myMEX_2.cpp 工作正常并显示从 MATLAB 命令 window 输入的数字。 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);
}

mxGetData returns 必须转换为 正确 数据类型的指针的 void 指针。

In C, mxGetData returns a void pointer (void *). Since void pointers point to a value that has no type, cast the return value to the pointer type that matches the type specified by 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 输入(您拥有)。

如果您想适当地处理多种类型的输入,您需要使用 mxIsDouble or mxIsClass 检查输入的类型。

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;
}