mxArray資料型別

masikkk發表於2014-05-20

1 、資料型別mxArray的操作

 

在上節的Matlab引擎函式中,所有與變數有關的資料型別都是mxArray型別。資料結構mxArray以及大量的mx開頭的函式,廣泛用於Matlab 引擎程式和Matlab C數學庫中。mxArray是一種很複雜的資料結構,與Matlab中的array相對應,我們只需熟悉Matlabarray型別和幾個常用的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);

引數mn為矩陣的行數和列數。ComplexFlag為常數,用來區分矩陣中元素是實數還是複數,取值分別為mxREALmxCOMPLEX。例如,建立一個35列的二維實數陣列,可用如下語句:

mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL);

注意:mxArray的儲存是先列後行的,而C/C++中是先行後列的。

對應的,要刪除一個陣列mxDestroyArray,該函式宣告如下:

void mxDestroyArray(mxArray *array_ptr);

引數array_ptr為要刪除的陣列指標。

例如,要刪除上面建立的陣列T,可用如下語句:

mxDestroyArray(T);

類似的建立函式還有:

mxArray *mxCreateString(const char *str);

建立一個字串型別並初始化為str字串。

一般的在VCMatlab互動中,以上兩種型別就夠了,其它型別陣列的建立這裡不再介紹。

 

2 、管理mxArray資料型別

2.1 管理mxArray資料大小

要獲得mxArray陣列每一維上元素的個數,可以用mxGetMmxGetN函式。其中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陣列中返回。對於常用的矩陣來說,用mxGetMmxGetN兩個函式就可以了。

另外還可以通過mxGetNumberOfDimensions來獲得陣列的總的維數,用mxSetMmxSetN設定矩陣的行數和列數,函式說明如下:

int mxGetNumberOfDimensions(const mxArray *array_ptr); //返回陣列的維數

void mxSetM(mxArray *array_ptr, int m); //設定陣列為m

void mxSetN(mxArray *array_ptr, int n); //設定陣列為n

 

2.2 判斷mxArray陣列型別

 

在對mxArray型別的變數進行操作之前,可以驗證以下其中的陣列的資料型別,比如是否為double陣列、整數、字串、邏輯值等,以及是否為某種結構、類、或者是特殊型別,比如是否為空陣列,是否為infNaN等。常見的判斷函式有:

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);

…… ……

這些函式比較簡單,意義自明,不再解釋。

 

2.3 管理mxArray陣列的資料

對於常用的double型別的陣列,可以用mxGetPrmxGetPi兩個函式分別獲得其實部和虛部的資料指標,這兩個函式的宣告如下:

double *mxGetPr(const mxArray *array_ptr); //返回陣列array_ptr的實部指標

double *mxGetPi(const mxArray *array_ptr); //返回陣列array_ptr的虛部指標

這樣,就可以通過獲得的指標對mxArray型別的陣列中的資料進行讀寫操作。例如可以用函式engGetVariableMatlab工作空間讀入mxArray型別的陣列,然後用mxGetPrmxGetPi獲得資料指標,對並其中的資料進行處理,最後呼叫engPutVariable函式將修改後的陣列重新寫入到Matlab工作空間。


原文地址:http://blog.chinaunix.net/uid-21372424-id-316767.html

相關文章