我正在尝试使用mex.h
标头将我编写的c ++程序转换为Matlab命令,并且我不知道他们的mxArray结构如何工作。
假设我有一个名为std::vector<float>
的{{1}}我要转换为mxArray我可以返回到matlab,我必须做这样的事情吗?
data
但是,matlab如何知道我要发送的mxSetData(plhs[0], static_cast<void*>(&(*(data.begin()))));
mxSetN(plhs[0], data.size());
mxSetM(plhs[0], 1);
的{{1}}是mxClassID
?为什么我不应该将mxArray
用于双数据?为什么mxSINGLE_CLASS
不存在?
答案 0 :(得分:1)
您似乎需要将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 );
BTW,你确定data
在堆上并且当你的mex函数终止时不会被解除分配吗?
或者,如果data
不是太大,您只需将其复制到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