从 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?

非常感谢任何帮助或想法!

【问题讨论】:

向量中每个向量的大小是否不同 >? 【参考方案1】:

此答案假定 eyeMatrix 是一个矩形矩阵(即每个内部向量具有相同的长度),因为生成的代码可能适用于非参差不齐的数组。

您可以查看:

https://***.com/a/24271438/3297440

和documentation 了解使用emxArray* 数据类型的概述。

总结答案,您将在文件&lt;name&gt;_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,我们可以称之为emxemx-&gt;size 将有 2 个元素,它们是您设置的尺寸。字段emx-&gt;data 将是指向rows*cols 值的指针(在您的情况下为double 值)。然后,您可以以列为主的方式将数据从eyeMatrix 复制到emx-&gt;data。所以如果你的矩阵是:

1, 2
3, 4

emx-&gt;data 中的数据应该是:

1, 3, 2, 4

从那里,只需传递 emx 作为输入。

最后,当您完成emxArray_real_T 值时,不要忘记调用正确的emxDestroyArray* 函数来清理所有分配的内存。

【讨论】:

非常感谢@RyanLivingston,我会努力解决的,我想我现在明白 emxArray 想要如何接收数据了! 听起来不错,不客气@Slash。如果您有其他问题,请回复。 我的代码运行良好@RyanLivingston!再次感谢,非常感谢

以上是关于从 MATLAB 生成代码后,在 C++ 中将 vector<> 转换为 emxArray_real_T的主要内容,如果未能解决你的问题,请参考以下文章

使用 MATLAB coder 将代码从 Registration Estimator 应用程序导出到 C++

如何在matlab中将两个图叠加到一起?

链接 Matlab 生成的 C++ 库的问题

使用 MATLAB 编码器将 MATLAB 转换为 C++

用matlab生成在单位球面上均匀的100个点几种方法?

在 C++ 中实现 Matlab Interp2d