如何设置填充mxSetData的mxArray的classID?

时间:2014-07-10 15:04:51

标签: c++ matlab mex

我正在尝试使用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不存在?

1 个答案:

答案 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