从 MATLAB 生成代码后,在 C++ 中将 vector<> 转换为 emxArray_real_T
Posted
技术标签:
【中文标题】从 MATLAB 生成代码后,在 C++ 中将 vector<> 转换为 emxArray_real_T【英文标题】:Convert vector<> to emxArray_real_T in C++ after code-generation from MATLAB 【发布时间】:2015-08-24 17:55:54 【问题描述】:我已经使用 MATLAB 编码器将一些 matlab 代码转换为 C++。
我知道有一些与此类似的问题,但我找到的解释都没有帮助解决我的问题,这有点不同。
为 C++ 生成的代码为我提供了以下功能:
void getTargetPoint(const emxArray_real_T *eyeMatrix, const emxArray_real_T
*HypAlpha, const emxArray_real_T *HypCov, const
emxArray_real_T *HypMean, const double xs[4], double Ymu[3])
Ymu 是我要查找的输出。但是,即使我在转换器中将输入定义为大小未定的数组,它们在我的代码中也是向量的向量:
eyeMatrix = vector<vector <double>>
它们都有不同的尺寸,例如 eyeMatrix = [968x4],但在任何其他情况下它可能是 [anything x 4]
我尝试了很多东西,但我无法将输入数据(向量的向量)转换为类型:emxArray_real_T
有没有办法做到这一点?或者我应该将输入数据转换为其他数据,然后转换为 emxArray_real_T?
非常感谢任何帮助或想法!
【问题讨论】:
向量中每个向量的大小是否不同此答案假定 eyeMatrix
是一个矩形矩阵(即每个内部向量具有相同的长度),因为生成的代码可能适用于非参差不齐的数组。
您可以查看:
https://***.com/a/24271438/3297440
和documentation 了解使用emxArray*
数据类型的概述。
总结答案,您将在文件<name>_emxAPI.h
中声明函数,如下所示:
extern emxArray_real_T *emxCreateWrapper_real_T(double *data, int rows,
int cols);
extern emxArray_real_T *emxCreate_real_T(int rows, int cols);
您会注意到第一个采用double *
。这应该是指向以列优先顺序存储的数据的指针。
由于eyeMatrix
可能按行优先顺序排列并且实际上可能并不连续(我不知道嵌套std::vectors
会产生连续数据的保证)第一步可以是调用emxCreate_real_T
合适的尺寸。
这分配并返回一个emxArray_real_T
,我们可以称之为emx
。 emx->size
将有 2 个元素,它们是您设置的尺寸。字段emx->data
将是指向rows*cols
值的指针(在您的情况下为double
值)。然后,您可以以列为主的方式将数据从eyeMatrix
复制到emx->data
。所以如果你的矩阵是:
1, 2
3, 4
emx->data
中的数据应该是:
1, 3, 2, 4
从那里,只需传递 emx
作为输入。
最后,当您完成emxArray_real_T
值时,不要忘记调用正确的emxDestroyArray*
函数来清理所有分配的内存。
【讨论】:
非常感谢@RyanLivingston,我会努力解决的,我想我现在明白 emxArray 想要如何接收数据了! 听起来不错,不客气@Slash。如果您有其他问题,请回复。 我的代码运行良好@RyanLivingston!再次感谢,非常感谢以上是关于从 MATLAB 生成代码后,在 C++ 中将 vector<> 转换为 emxArray_real_T的主要内容,如果未能解决你的问题,请参考以下文章