从 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
,我们可以称之为 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*
函数来清理所有分配的内存。
我已经使用 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
,我们可以称之为 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*
函数来清理所有分配的内存。