Matlab和C混合編程

轉自:zc02051126的CSDN博客

鏈接:Matlab和C混合編程 - super - 博客頻道 - CSDN.NET

-------------------------------------------------------------------------

一、 MEX文件概述

1.1介紹MEX文件

如果想在Matlab中,以Matlab函數的方式調用C程序,那就要用到MEX文件。將C按照一定的格式編寫,並編譯最終形成MEX文件(後綴為mexw32,不同的Matlab版本這個後綴稍有不同,本文用的是Matlab200b),只要這個MEX文件在Matlab搜索路徑中,即可像Matlab工具箱中的函數一樣使用了。

1.2 MEX文件的應用

? 如果Matlab需要調用已有的C演算法,不需要將其翻譯成m文件,只需要將其編譯成MEX文件即可。

? 如果為了性能,必須使用C編寫核心代碼。

1.3 MEX文件的組成部分

使用mex命令可以將C文件編譯成二進位的mex文件。mex將源文件編譯和連接成可被調用的動態鏈接庫。一旦將C編譯成mex文件後就可以像Matlab工具箱中的函數一樣使用。

MEX文件由如下部分組成:

? C和Matlab之間的介面函數(mexFunction實現

? 用C編寫的實現特定功能的計算程序(由用戶編寫完成特定的功能)

? 與平台相關的預處理宏(Windows平台下與C相關的宏,主要與mxArray類相關)

1.3.1 C和Matlab之間的介面函數

介面函數是MEX文件的入口點,通過介面Matlab才能調用MEX文件,創建入口函數包括如下步驟:

? 介面函數簽名:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]);

? 介面參數:

介面必須包括如下參數prhs,nrhs,plhs,和nlhs詳細介紹如下表

參數名稱

參數描述

prhs

輸入參數

plhs

輸出參數

nrhs

輸入參數的個數

nlhs

輸出參數的個數

? 創建使用源文件:

可以將C的源文件和mexFunction入口函數寫在一個文件中,也可以將C的源文件和mexFunction分別寫成不同的函數。

? 使用Matlab庫:

Matlab函數庫提供了介面函數mexFunction和C計算函數之間的數據轉換。

? 包含相關頭文件

為了使用mex的API需要包含頭文件mex.h

#include "mex.h"

? MEX文件命名

MEX文件名就是被Matlab調用時的函數名,這個名稱是包含入口函數的C的源文件名(結果改造的C源文件,已經包括了入口點函數)。

1.3.2 用C編寫的實現特定功能的計算程序

這部分是原始的未經過改造的C源文件,能夠實現用戶特定的功能。

1.2.3 預處理宏

mex文件用mwSize代表位數大小,比如矩陣維數大小,數組中元素的個數。

參考實例

Matlab調用C生成的MEX屬於異構程序之間的整合,總的來說需要解決兩個問題:介面和數據轉換(由mxArray實現)。為了清楚解釋整個的MEX文件的組成,下面以一個具體而微的例子說明。

假設有如下的C代碼,它的功能是輸入x,y,返回結果在z中,代碼如下

void arrayProduct(double x, double *y, double *z, int n)

{ int i;

for (i=0; i<n; i++)

z[i] = x * y[i];

}

1 創建mexFunction介面

如果要求Matlab能夠調用C代碼,就需要將C代碼封裝到mexFunction入口函數中

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

/* 在此聲明一些變數,並調用C的代碼,所有的工作都在這裡*/

}

int nlhs, mxArray *plhs[]:這兩個參數描述了輸出參數信息,nlhs是輸出參數個數,具體的輸出參數存放在plhs中。

nrhs, const mxArray *prhs[]:這兩個參數描述了輸入參數的信息,nrhs描述輸入參數個數,具體的輸入參數存放在prhs中。

2 修改C源碼

需要將C源碼中的數據格式進行調整,如下

void arrayProduct(double x, double *y, double *z, mwSize n)

{ mwSize i;

for (i=0; i<n; i++)

z[i] = x * y[i];}

int n需要改為mwSize n,mwSize相當於C語言中的int格式。

3 在mexFunction中檢查輸入參數和輸出參數(可選)

if(nrhs!=2) { //檢查輸入參數是否為兩個,如果不是兩個報錯

mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs",

"Two inputs required.");

}

if(nlhs!=1) { //檢查輸出參數是否為一個,如果不是一個報錯

mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs",

"One output required.");

}

if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || mxGetNumberOfElements(prhs[0])!=1 ) {//檢查輸入的第一個參數是否為標量

mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notScalar",

"Input multiplier must be a scalar.");

}

if(mxGetM(prhs[1])!=1) {//檢查輸入的第一個參數是否為一維數組

mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notRowVector",

"Input must be a row vector.");

}

4 處理輸入參數

為了給void arrayProduct(double x, double *y, double *z, mwSize n)介面傳遞參數,需要從prhs參數中將每個輸入參數取出來,下面的代碼需要寫在mexFunction介面的開始位置

double multiplier; /*相當於x*/

double *inMatrix; /* 相當於y,維數為1xN */

mwSize ncols; /* 相當於n*/

multiplier = mxGetScalar(prhs[0]);//從prhs中獲取x

inMatrix = mxGetPr(prhs[1]);//從prhs中獲取y

ncols = mxGetN(prhs[1]);//從prhs中獲取n

5 處理輸出參數

和處理輸入參數類似,對輸出參數的處理如下

double *outMatrix; /* 相當於輸出參數z*/

plhs[0] = mxCreateDoubleMatrix(1,ncols,mxREAL);//創建輸出參數矩陣

outMatrix = mxGetPr(plhs[0]);//獲得輸出參數矩陣的指針

6 小結

1.3.1-1.3.5整個過程可以用以下示意圖表示為

注意:以上代碼中用到的函數,如mxGetM等的具體功能可以參考Matlab幫助文件,這種函數太多無法一一詳細介紹

完整的C源代碼,見arrayProduct.c文件。

1.4設置MATLAB來生成MEX文件

1.3中改寫好的代碼需要編譯成MEX,Matlab自帶默認的Lcc編譯器,如果電腦上裝有其它的編譯器如VS,也可以選用其它的編譯器。

在Matlab的命令行中輸入mex –setup,顯示如下結果

如果選擇y則使用默認的編譯器,如果選擇n,顯示如下圖,列出了當前的Matlab支持的外部編譯器類型,本文使用Matlab2009,VS的版本是2008SP1,所以可以選擇8

下圖中的最後一行顯示了VS2008SP1的安裝位置,如果正確選擇y,否則選擇n,重新設置VS2008SP1的安裝位置,然後按照提示配置完成。

1.5編譯和運行MEX文件

在命令行中輸入

mex arrayProduct.c

編譯完成後會生成arrayProduct.mexw32文件,可以像Matlab內置函數一樣調用它了。

二、MEX文件的輸入輸出

2.1 MEX文件中的數據流

以一個例子展示MEX文件的數據流。

2.1.1 數據的輸入與輸出

假設有MEX文件myFunction,其有兩個輸入參數和一個輸出參數。Matlab的調用方式為x=myFuncntion(y,z)。

Matlab用以下參數形式,通過介面函數mexFunction調用myFunction。

輸入是prhs,其含有兩個單元的C數組,所以此時nrhs=2。prhs的第一個元素是一個指向y的mxArray類型的指針,第二個元素是一個指向z的mxArray類型的指針。輸出是plhs,是一個含有一個單元的C類型數組,所以此時nlhs=1。

在介面函數中創建一個輸出數組,並將plhs[0]指向它。如果沒有設置輸出參數,而在調用的時候有返回參數,此時Matlab將會報錯。

2.1.2 介面函數mexFunction中的數據流

在下面這個例子中,調用的MEX文件為[C,D]=func(A,B)。當在Matlab中調用時,Matlab將輸入參數A和B傳遞給MEX文件,C和D是返回參數。

在func.c中,首先使用mxCreate*函數(meArray的API函數)創建輸出參數,然後用plhs[0]和plhs[1]指向創建的輸出參數;使用mxGet*函數從輸入參數prhs[0]和prhs[1]中獲取輸入參數。最後調用真正完成特定功能的計算程序計算,並將相應的輸入和輸出指針傳遞給該計算程序。

2.2 MATLAB 數據

Matlab數據包括:標量數據,向量數據,矩陣數據,字元串數據,元包數據,結構體,對象。這些數據在Matlab中都是以數組形式存儲的。在C中Matlab數組用mxArray表示。

2.3 mxArray class

要想在Matlab中調用C編譯成的MEX文件,需要將Matlab的數據格式轉化為C的數據格式。在Matlab中使用mxArray完成這種轉化,通過能夠通過mxArray類獲取Matlab中的數據結構類型,其獲取的信息如下

? 數據類型

? 數據維數

? 數據本身

? 如果是浮點型的,那麼是浮點型的複數還是實數

? 如果是稀疏數據,數據的索引和數據值

? 如果是結構體或對象,域的個數或者域名是什麼

以上的這些信息都是通過mxArray類中的API完成的,在下面的2.5中將會介紹常用的API。

2.4 使用指針

通過指針完成輸入和輸出參數的傳遞,例子如下

inMatrix = mxGetPr(prhs[1]);//獲得prhs[1]的指針,作為輸入參數

plhs[0] = mxCreateDoubleMatrix(1,ncols,mxREAL);//創建一維數組作為輸出

outMatrix = mxGetPr(plhs[0]);//獲得輸出函數額指針

2.5 使用mxArray API 函數

本節將介紹mxArray中常用的API

2.5.1 判斷數據類型的mxArray方法

bool mxIsDouble(const mxArray *pm);//如果pm是浮點型返回true

bool mxIsInf(double value);//如果value為無窮大返回true

2.5.2 獲取數據維度

size_t mxGetM(const mxArray *pm);//獲得pm的行數

size_t mxGetN(const mxArray *pm);//獲得pm的列數

size_t mxGetNumberOfElements(const mxArray *pm);//獲得pm中元素的個數

2.5.3 獲取數據本身

通過指針獲取數據,見2.4

2.6 使用字元串

mxArray *mxCreateString(const char *str);

2.7 何時使用MEX文件

見1.2

2.8 處理數據

在這部分,將舉例說明如何處理二位數組,字元串如何使用。

三、 MEX文件界面

2.1 顯示診斷信息

在使用MEX文件時可能有些錯誤信息顯示出來,需要用戶了解產生這些錯誤信息的原因,概括如下:

2.1.1 MEX存在平台版本問題

如果運行MEX的Matlab版本和編譯它的版本不一致時會導致錯誤信息,如下

??? Invalid MEX-file <mexfilename>:

The specified module could not be found.

2.2.2 Matlab所支持的編譯器版本

不同的Matlab會支持不同的編譯器版本,如果編譯器選擇的不對會造成編譯錯誤。

2.2.3 編寫的C源代碼是否為ANSI C編寫

如果C代碼中的語法不是標準C也可能產生問題。

2.2.4 mexFunction介面錯誤造成的編譯錯誤

如果顯示如下錯誤可能是mexFunction入口函數拼寫錯誤造成的,導致找不到入口的錯誤

Unable to load mex file:

??? Invalid MEX-file

2.2.5 匯流排錯誤

當MEX文件訪問被保護、只讀或者未被分配的內存區域時會報錯。而這種錯誤卻很難被發現。

可以通過以下錯誤減少這種錯誤的發生

? 重新編譯MEX文件,並加上參數檢查功能。在編譯的時候使用mex的腳本編譯選項-argcheck選項,當再有問題時系統將會給出警告。

? 再debug下進行調試。

2.2.6 計算結果錯誤

當計算結果錯誤時,可能是計算程序邏輯錯誤,或者是某些變數沒有初始化。

可能產生錯誤信息的地方如下圖

2.2 內存分配

在MEX文件中如果需要動態分配內存可以用如下的mexArray的API

mwPointer mxCalloc(n, size)

void *mxMalloc(mwSize n);

mwPointer mxRealloc(ptr, size)

2.3 防止內存泄漏

在MEX文件調用完成後,除了plhs[]參數列表相關內存保留外,所有的MEX文件內部動態分布的內存都自動清除,包括在2.2中用到的內存分配的方法。

一般來說還是推薦用戶刪除開闢的動態內存,而不是靠系統自動刪除動態開闢的內存。

不過如下情況必須考系統自動回收內存(用戶不能顯示回收)

? 輸入參數prhs[]內存

? 輸出參數plhs[]內存

? 通過函數mexGetVariablePtr獲得的指針

? 創建的結構體

2.3.1 錯誤的使用回收內存函數

不能用mxFree回收mxArray內存空間,而應該使用如下的方式回收

mxArray *temp = mxCreateDoubleMatrix(1,1,mxREAL);

mxFree(temp); /* 錯誤 */

mxDestroyArray(temp); /*正確 */

因為mxFree刪除的是數據結構的頭指針,存儲數據的空間不會被刪除,當退出MEX文件時Matlab還會自動回收臨時變數的空間所以還會再一次自動刪除temp的指針,這樣就會發生錯誤。

2.3.2 錯誤的使用賦值函數導致內存回收失敗

下面的例子將會產生奇怪的錯誤,因為在MEX文件被調用完成後,其內部除了輸入、輸出參沒有被Matlab自動銷毀外,其它臨時變數都是由Matlab自動回收內存的。下面的代碼首先創建一個mxArray類型的數組,然後將輸入參數prhs[0]的值拷貝給temp,這會導致問題,因為MEX文件調用結束後temp將被自動回收,那麼prhs將被刪除;而之前一再強調prhs的參數是不能被Matlab自動回收的。

mxArray *temp = mxCreateCellMatrix(1,1);

mxSetCell(temp, 0, prhs[0]); /* 錯誤 */

所以正確的做法是如下,將prhs做一份拷貝操作

mxSetCell(temp, 0, mxDuplicateArray(prhs[0])); /* 正確 */

2.3.3 錯誤使用數據導致內存報錯

下面的例子先創建一個空的mxREAL類型的數組temp,然後將double型的數組中元素拷貝給temp,會出現錯誤,因為mxSetPr要求data必須是用mxCalloc,mxMalloc,mxRealloc動態開闢的

mxArray *temp = mxCreateDoubleMatrix(0,0,mxREAL);

double data[5] = {1,2,3,4,5};

...

mxSetM(temp,1); mxSetN(temp,5); mxSetPr(temp, data); /* 錯誤 */

所以需要改成如下方式,用memcpy方法實現

mxArray *temp = mxCreateDoubleMatrix(1,5,mxREAL);

double data[5] = {1,2,3,4,5};

...

memcpy(mxGetPr(temp), data, 5*sizeof(double)); /* 正確 */

2.3.4 防止內存泄露

下面情況會造成內存泄露,泄露空間大小為5*5*8位元組,因為double是8個位元組。

pr = mxCalloc(5*5, sizeof(double));

... <load data into pr>

plhs[0] = mxCreateDoubleMatrix(5,5,mxREAL);

mxSetPr(plhs[0], pr); /* INCORRECT */

改造的方法如下

plhs[0] = mxCreateDoubleMatrix(5,5,mxREAL);

pr = mxGetPr(plhs[0]);

... <load data into pr>

或者

pr = mxCalloc(5*5, sizeof(double));

... <load data into pr>

plhs[0] = mxCreateDoubleMatrix(5,5,mxREAL);

mxFree(mxGetPr(plhs[0]));

mxSetPr(plhs[0], pr);

2.4 處理輸入輸出內存

輸入內存和輸出內存的處理由系統控制,即使MEX文件別調用結束後輸入輸出內存也是存在的,用戶不要動態的回收輸入和輸出內存,也不能由於某些錯誤操作,誤回收輸入輸出內存。

例如在2.3.2中mxSetCell(temp, 0, prhs[0]); /* 錯誤 */就會導致在MEX文件別調用結束後prhs自動回收,這就會導致問題,所以要注意。

2.3.4中顯示了輸出內存處理不當會造成內存泄露。

2.5 調試 MEX文件

見演示

三、 從C代碼中調用MATLAB

4.1 介紹MATLAB engine

所謂Matlab引擎(engine),是指一組Matlab提供的介面函數,支持C/C++、Fortran等語言,通過這些介面函數,用戶可以在其它編程環境中實現對Matlab的控制。可以主要功能有:

? 打開/關閉一個Matlab對話。

? 向Matlab環境發送命令字元串。

? 從Matlab環境中讀取數據。

? 向Matlab環境中寫入數據。

與其它各種介面相比,引擎所提供的Matlab功能支持是最全面的。通過引擎方式,應用程序會打開一個新的Matlab進程,可以控制它完成任何計算和繪圖操作。對所有的數據結構提供100%的支持。同時,引擎方式打開的Matlab進程會在任務欄顯示自己的圖標,打開該窗口,可以觀察主程序通過engine方式控制Matlab運行的流程,並可在其中輸入任何Matlab命令。

4.2 MATLAB engine應用中的數據流

數據流主要包括如下

1、啟動Matlab引擎

2、將C環境下的數據送入Matlab工作空間

3、將要執行的Matlab腳本送入Matlab空間並執行

4、從Matlab空間中取回結算結果

5、關閉Matlab引擎。

4.3 調用MATLAB engine

4.3.1 引擎環境配置

要在C中成功編譯Matlab引擎程序,必須完成如下配置

? 在編譯器中包含引擎頭文件engine.h所在的路徑

? 在編譯器中加入Matlab對應的依賴庫文件libmx.lib、libmat.lib、libeng.lib,並加入以上庫文件所在的路徑

? 在path路徑中加入libeng.dll動態鏈接庫文件所在的路徑(切記否則編譯可以通過運行會出錯)

4.3.2 引擎API詳解

在調用Matlab引擎之前,首先應在相關文件中加入一行:#include "enging.h",該文件包含了引擎API函數的說明和所需數據結構的定義。可以在C中調用的引擎函數分別如下:

1 引擎的打開和關閉

engOpen-打開Matlab engine

函數聲明:

Engine *engOpen(const char *startcmd);

參數startcmd是用來啟動Matlab引擎的字元串參數,在Windows操作系統中只能為NULL。

函數返回值是一個Engine類型的指針,它是在engine.h中定義的engine數據結構。

engClose-關閉Matlab 引擎

函數聲明:

int engClose(Engine *ep);

參數ep代表要被關閉的引擎指針。

函數返回值為0表示關閉成功,返回1表示發生錯誤。

例如,通常用來打開/關閉Matlab引擎的代碼如下:

Engine *ep; //定義Matlab引擎指針。

if (!(ep=engOpen(NULL))) //測試是否啟動Matlab引擎成功。

{

MessageBox("Cant start Matlab engine!" );

exit(1);

}

. …………

engClose(ep); //關閉Matlab引擎。

2 向Matlab發送命令字元串

engEvalString-發送命令讓Matlab執行。

函數聲明:

int engEvalString(Engine *ep, Const char *string);

參數ep為函數engOpen返回的引擎指針,字元串string為要matlab執行的命令。

函數返回值為0表示成功執行,返回1說明執行失敗(如命令不能被Matlab正確解釋或Matlab引擎已經關閉了)。

3 獲取Matlab命令窗口的輸出

要在C中獲得函數engEvalString發送的命令字元串被Matlab執行後在matlab窗口中的輸出,可以調用engOUtputBuffer函數。

函數聲明:

int engOutputBuffer(Engine *ep, char *p, int n);

參數ep為Matlab引擎指針,p為用來保存輸出結構的緩衝區,n為最大保存的字元個數,通常就是緩衝區p的大小。該函數執行後,接下來的engEvalString函數所引起的命令行輸出結果會在緩衝區p中保存。如果要停止保存,只需調用代碼:engOutputBuffer(ep, NULL, 0)。

4 讀寫Matlab數據

4.1從Matlab引擎工作空間中獲取變數。

mxArray *engGetVariable(Engine *ep, const char *name);

參數ep為打開的Matlab引擎指針,name為以字元串形式指定的數組名。

函數返回值是指向name數組的指針,類型為mxArray*(mxArray數據類型在本文第4節詳細簡介)

4.2 向Matlab引擎工作空間寫入變數。

int engPutVariable(Engine *ep, const char *name, const mxArray *mp);

參數ep為打開的Matlab引擎指針,mp為指向被寫入變數的指針,name為變數寫入後在Matlab引擎工作空間中的變數名。

函數返回值為0表示寫入變數成功,返回值為1表示發生錯誤。

5 調用引擎時顯示/隱藏Matlab主窗口

默認情況下,以engine方式調用Matlab的時候,會打開Matlab主窗口,可在其中隨意操作。但有時也會干擾應用程序的運行,可用以下設置是否顯示該窗口。

int engSetVisible(Engine *ep, bool value);

參數ep為打開的Matlab引擎指針,value為是否顯示的標誌,取值true(或1)表示顯示Matlab窗口,取值false(或0)表示隱藏Matlab窗口。

函數返回值為0表示設置成功,為1表示有錯誤發生。

要獲得當前Matlab窗口的顯示/隱藏情況,可以調用函數:

int engGetVisible(Engine *ep, bool *value);

參數ep為打開的Matlab引擎指針,Value為用來保存顯示/隱藏情況的變數(採用指針方式傳遞)。

函數返回值為0表示獲取成功,為1表示有錯誤發生。

參考:數據類型mxArray的操作

  Matlab引擎函數中,所有與變數有關的數據類型都是mxArray類型。數據結構mxArray以及大量的mx開頭的函數,廣泛用於Matlab 引擎程序和Matlab C數學庫中。mxArray是一種很複雜的數據結構,與Matlab中的array相對應,我們只需熟悉Matlab的array類型和幾個常用的mxArray函數即可。

C中,所有和Matlab的數據交互都是通過mxArray來實現的,在使用mxArray類型的程序中,應包含頭文件matrix.h,不過在引擎程序中,一般會包含頭文件engine.h,該文件裡面已經包含了matrix.h,因此無需重複包含。

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交互中,以上兩種類型就夠了,其它類型數組的創建這裡不再介紹。

2 管理mxArray數據類型

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列

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

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工作空間。

4.3.3 調用實例

1直接在通過字元串執行腳本

2通過函數名執行腳本

4.4 編譯和運行MATLAB engine 程序

這部分的功能是將調用Matlab引擎的C源代碼編譯成可執行程序

以下命令會將mexfilename.c編譯成mexfilename.exe文件,具體執行見演示。

mex(-f, [matlabroot ...

binwin32mexoptslccengmatopts.bat], mexfilename);

【注意:在執行編譯後的mexfilename.exe程序時可能會報告無法找到lib*.dll庫文件,需要將matlabrootbinwin32加入到path路徑中,這樣系統才能找到需要執行的庫文件。】


推薦閱讀:

TAG:MATLAB | C编程语言 | 编程 |