VC++與Matlab混合編程之引擎操作詳解(3)資料類型mxArray的操作

來源:互聯網
上載者:User

 

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節程式執行個體。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.