使用 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]);
mxGetPr
与 mxGetData
相同,除了 它会自动将 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;
}
我正在尝试编写一个简单的 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 avoid
pointer (void *
). Sincevoid
pointers point to a value that has no type, cast the return value to the pointer type that matches the type specified bypm
在你的情况下,我假设虽然看起来你传递了一个整数,但它实际上是一个 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]);
mxGetPr
与 mxGetData
相同,除了 它会自动将 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;
}