c++ - 如何设置填充有 mxSetData 的 mxArray 的 classID?

标签 c++ matlab mex

我正在尝试使用 mex.h将我编写的 c++ 程序转换为 Matlab 命令的 header ,但我不明白它们的 mxArray 结构是如何工作的。

假设我有一个 std::vector<float>称为 data我想转换为 mxArray 我可以返回到 matlab,我必须做这样的事情对吗?

mxSetData(plhs[0], static_cast<void*>(&(*(data.begin()))));
mxSetN(plhs[0], data.size());
mxSetM(plhs[0], 1);

但是 matlab 怎么知道 mxClassIDmxArray我要发的是mxSINGLE_CLASS ?为什么我不应该使用 mxSetData对于双重数据?为什么不 mxSetClassID存在吗?

最佳答案

看来您需要将plhs[0] 预定义为float 类型,然后设置指针。

plhs[0] = mxCreateNumericMatrix( 1, data.size(), mxSINGLE_CLASS, mxREAL );
void* oldAllocation = mxGetData( plhs[0] ); // for de-allocation
mxSetData(plhs[0], static_cast<void*>(&(*(data.begin()))));
mxFree( oldAllocation );

顺便说一句,您确定 data 在堆上并且不会在您的 mex 函数终止时被取消分配吗?


或者,如果数据不是太大,你可以简单地将它复制到plhs[0](我通常这样做)

plhs[0] = mxCreateNumericMatrix( 1, data.size(), mxSINGLE_CLASS, mxREAL );
float* dst = (float*)mxGetData( plhs[0] ); 
for ( int i = 0 ; i < data.size(); i++ ) {
    dst[i] = data[i];
}
// or use memcpy instead of the loop

关于c++ - 如何设置填充有 mxSetData 的 mxArray 的 classID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24680025/

相关文章:

python - 如何在Python中制作一个精明的边缘检测器,如edge() Matlab函数

c - 将 C MEX 文件转换为纯 C++ 时出错

c++ - 引用函数按值返回和自动

c++ - 全局静态生命周期?他们会让你的程序崩溃吗?

c++ - 如何通过调用 c++ dll 来运行 Matlab 文件

c - 具有 MATLAB mex 函数的用户定义结构

macos - 在 Mac OS X 10.11.1 (El Capitan) 上为 Matlab R2015a 安装 IPOPT

c++ - 如何访问位集中的位范围?

c++ - 交叉构建,链接问题

matlab - 在 MATLAB 中对矩阵进行排序