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路徑中,這樣系統才能找到需要執行的庫文件。】
推薦閱讀: