4. 資料類型mxArray的操作
在上節的Matlab引擎函數中,所有與變數有關的資料類型都是mxArray類型。資料結構mxArray以及大量的mx開頭的函數,廣泛用於Matlab 引擎程式和Matlab C數學庫中。mxArray是一種很複雜的資料結構,與Matlab中的array相對應,我們只需熟悉Matlab的array類型和幾個常用的mxArray函數即可。
在VC中,所有和Matlab的資料互動都是通過mxArray來實現的,在使用mxArray類型的程式中,應包含標頭檔matrix.h,不過在引擎程式中,一般會包含標頭檔engine.h,該檔案裡面已經包含了matrix.h,因此無需重複包含。
4.1 建立和清除mxArray型資料
Matlab有很多種變數類型,對應於每種類型,基本上都有一個函數用於建立,但它們都有相同的資料結構,就是mxArray。
數組的建立採用mxCreatexxx形式的函數,例如建立一個double類型數組,可用函數mxCreateDoubleMatrix,函數形式如下:
mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);
參數m和n為矩陣的函數和列數。ComplexFlag為常數,用來區分矩陣中元素是實數還是複數,取值分別為mxREAL和mxCOMPLEX。
例如,建立一個
3
行
5
列的二維實數數組
,可用如下語句:
mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL);
對應的,要刪除一個數組mxDestroyArray,該函式宣告如下:
void mxDestroyArray(mxArray *array_ptr);
參數array_ptr為要刪除的數組指標。
例如,要刪除上面建立的數組T,可用如下語句:
mxDestroyArray(T);
類似的建立函數還有:
mxArray *mxCreateString(const char *str);
建立一個字串類型並初始化為str字串。
一般的在VC與Matlab互動中,以上兩種類型就夠了,其它類型數組的建立這裡不再介紹。
4.2 管理mxArray資料類型
4.2.1 管理mxArray資料大小
要獲得mxArray數組每一維上元素的個數,可以用mxGetM和mxGetN函數。其中mxGetM用來獲得數組第一維的元素個數,對於矩陣來說就是行數。
int mxGetM(const mxArray *array_ptr); //
返回
array_ptr
對應數組第一維的元素個數(行數)
int mxGetN(const mxArray *array_ptr); //
返回
array_ptr
對應數組其它維的元素個數,對於矩陣
來說是列數。對於多維陣列來說是從第2維到最後一維的各維元素個數的乘積。
要獲得某一特定維的元素個數,則要用函數:
const int *mxGetDimensions(const mxArray *array_ptr);
該函數返回array_ptr各維的元素個數儲存在一個int數組中返回。對於常用的矩陣來說,用mxGetM和mxGetN兩個函數就可以了。
另外還可以通過mxGetNumberOfDimensions來獲得數組的總的維數,用mxSetM、mxSetN設定矩陣的行數和列數,函數說明如下:
int mxGetNumberOfDimensions(const mxArray *array_ptr); //返回數組的維數
void mxSetM(mxArray *array_ptr, int m); //設定數組為m行
void mxSetN(mxArray *array_ptr, int n); //設定數組為n列
4.2.2 判斷mxArray數群組類型
在對mxArray類型的變數進行操作之前,可以驗證以下其中的數組的資料類型,比如是否為double數組、整數、字串、邏輯值等,以及是否為某種結構、類、或者是特殊類型,比如是否為空白數組,是否為inf、NaN等。常見的判斷函數有:
bool mxIsDouble(const mxArray *array_ptr);
bool mxIsComplex(const mxArray *array_ptr);
bool mxIsChar(const mxArray *array_ptr);
bool mxIsEmpty(const mxArray *array_ptr);
bool mxIsInf(double value);
…… ……
這些函數比較簡單,意義自明,不再解釋。
4.2.3 管理mxArray數組的資料
對於常用的double類型的數組,可以用mxGetPr和mxGetPi兩個函數分別獲得其實部和虛部的資料指標,這兩個函數的聲明如下:
double *mxGetPr(const mxArray *array_ptr); //返回數組array_ptr的實部指標
double *mxGetPi(const mxArray *array_ptr); //返回數組array_ptr的虛部指標
這樣,就可以通過獲得的指標對mxArray類型的數組中的資料進行讀寫操作。例如可以用函數engGetVariable從Matlab工作空間讀入mxArray類型的數組,然後用mxGetPr和mxGetPi獲得資料指標,對並其中的資料進行處理,最後調用engPutVariable函數將修改後的數組重新寫入到Matlab工作空間。具體實現見第5節程式執行個體。