繁体   English   中英

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

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

我已经使用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://stackoverflow.com/a/24271438/3297440

以及有关使用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*函数来清理所有分配的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM