matlab内包含元胞数组自动转cpp

在使用MATLAB自动转换CPP代码时,元胞数组也是可以自动转换的。matlab版本我用的是r2017a,以下笔记,记录自己的学习步骤

1、MATLAB自动转换,具体过程网上很多例程,本篇笔记主要记录元胞数组如何转成cpp,在手动输入参数类型时,有如下选择

cell(同质/异质),我选的是同质,具体区别不是专业的也不去研究。继续选择大小,

我选择1*n表示该元胞不止一个,

{:}内容为元胞数组数据类型以及大小,按实际选择即可。

2、转化出来后的函数有多个,打开其中一个和m函数同名文件可以发现,元胞数组参数类型为emxArray_cell_wrap_0,

该类型定义在XX_types.h(XX为转化时m函数名),具体内容如下:

struct emxArray_cell_wrap_0
{
  cell_wrap_0 *data;
  int *size;
  int allocatedSize;
  int numDimensions;
  boolean_T canFreeData;
};

可以发现,元胞数组在c++中是通过结构体来表示的。

3、解析结构体。

       先看看emxArray_cell_wrap_0,里面包含5个成员,打开cell_wrap_0,发现定义如下

typedef struct {
  emxArray_real_T *f1;
} cell_wrap_0;

struct emxArray_real_T
{
  double *data;
  int *size;
  int allocatedSize;
  int numDimensions;
  boolean_T canFreeData;
};

由此,一个元胞数组表示法就清晰了,主要是通过一个结构体,结构体内再包含结构体表示,结构体成员又分别表示什么呢?

我们知道,在MATLAB里面,一个元胞数组里面可以有多个元胞,而每个元胞也可以是元胞数组,也就是可以一一对应了,一个大的外层元胞数组用emxArray_cell_wrap_0实例化对象表示,里面的具体元胞数组成员用emxArray_real_T表示。具体含义就是,假设一个元胞数组A={a,b,c},a={1,1,1},(b类似,理解就好),那么,A就用emxArray_cell_wrap_0对象表示,a或者b就是emxArray_real_T。这是关键,懂了这一步后面的就好理解了。

       emxArray_cell_wrap_0里面有5个成员,第一个解析完了, int *size;表示元胞数组有多少元胞,比如A那size[1]就是3,sizeo[0]写1,注意,size是一个数组,不管是这个结构体还是下面即将解析那个,size都是包含2个变量的数组,locatedSize表示需要申请多少空间,此处是3个emxArray_real_T大小。其实,只要理解意思就好,初始化时,自动转化函数会有相应的初始化函数,帮助申请空间,释放空间等,只需要传进大小即可。

       emxArray_real_T是自动转化函数里面数组的通用表示,data自然不用说,存放实际数据,size[0]放1,size[1]为该元胞实际数量,为什么这样设计,主要是为了计算方便。其它成员和上述结构体功能类似。由此,元胞数组在c++中表示的结构体解析完毕。

说一句题外话,任何函数转换完后,都会有一个main.c,里面会有参数如何初始化,如何调用的方法,知道这点,可以少走很多弯路。在我的函数中,我是这样使用的。使用该结构体前,需要emxCreate_cell_wrap_0(nRow, nCol);初始化结构体,申请分配空间,函数返回emxArray_cell_wrap_0 *指针,但是里面
数据结构体未指向明确,初始化指向NULL,所以使用时还需要调用emxCreate_real_T(nRow, nCol),函数返回emxArray_real_T *指针,赋值给hangzhou_long->data[i]即可使用。

再补充一点,matlab源程序里面如果有end,即取数组最后一个元素,那么这句话要手转,自动转的函数和源程序意思不符

猜你喜欢

转载自blog.csdn.net/qq_38150742/article/details/82895369