gpt4 book ai didi

c++ - 使用 mxGetPr 与 mxGetData

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:28 30 4
gpt4 key购买 nike

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

Number of Requested Objects := 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);
}

最佳答案

mxGetData返回一个 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 检查输入的类型。或 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;
}

关于c++ - 使用 mxGetPr 与 mxGetData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41852896/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com