我正在尝试使用 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 怎么知道 mxClassID
的 mxArray
我要发的是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/