1. 程式人生 > >matlab內包含元胞陣列自動轉cpp

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]即可使用。