gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:15 24 4
gpt4 key购买 nike

我正在尝试使用 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/

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