从 MATLAB 生成代码后,在 C++ 中将 vector<> 转换为 emxArray_real_T

Convert vector<> to emxArray_real_T in C++ after code-generation from MATLAB

我已经使用 MATLAB 编码器将一些 matlab 代码转换为 C++。

我知道有一些问题与这个问题类似,但是 none 我找到的解释确实对我的问题有所帮助,但有些不同。

为 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 是一个矩形矩阵(即每个内部向量具有相同的长度),因为生成的代码可能适用于非参差不齐的数组。

您可以查看:

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

这会分配 returns 一个 emxArray_real_T,我们可以称之为 emxemx->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* 函数来清理所有分配的内存。