就我目前了解的c++調用matlab有兩種方法。
第一種是通過matlab引擎調用,也就是這里用到的方法。
第二種是用matlab將m文件編譯為相應的h/lib/dll文件再加以調用。
使用engine所用到的h和lib文件基本在D:\Program Files\MATLAB\R2010b\extern里面,當然不同的機器安裝的地方都不一樣。
頭文件只需engine.h即可。lib文件需要這三個:libmx.lib/libmat.lib/libeng.lib。至於如何配置我就不介紹了,方法很多。
引擎相應的部分函數如下:
engOpen:啟動Matlab引擎
engClose:關閉Matlab引擎
engGetArray:從Matlab引擎中獲得一個Matlab矩陣,用於數據交換
engPutArray:從應用程序向Matlab引擎發送一個Matlab矩陣,用於數據交換
engEvalString:執行一個Matlab命令
engOutputBuffer:創建一個用於存儲Matlab文本輸出的字符緩沖區
相應例程:
#include <iostream> #include <math.h> #include "engine.h" using namespace std; void main() { Engine *ep; //定義Matlab引擎指針。 if (!(ep=engOpen(NULL))) //測試是否啟動Matlab引擎成功。 { cout <<"Can't start Matlab engine!" <<endl; exit(1); } //下面是將c++格式數據轉換為matlab格式可用數據 double data[4]={1.0,2.0,3.0,4.0}; mxArray *Y=mxCreateDoubleMatrix(1,4,mxREAL); memcpy(mxGetPr(Y),data,sizeof(data)); engPutVariable(ep,"Y",Y); engEvalString(ep,"plot(Y,'o')"); //顯示數據 mxDestroyArray(Y); engEvalString(ep,"figure"); //開一個新的顯示窗口 ////////////////////////////////////////////////////////// //下面是從matlab格式數據轉換為c++格式可用數據 // mxArray *filename=NULL; // const char *name="D:/Program Files/MATLAB/R2010b/bin/win32/lena.jpg"; // filename=mxCreateString(name); // engPutVariable(ep,"filename",filename); engEvalString(ep,"X=imread('D:/Program Files/MATLAB/R2010b/bin/win32/lena.jpg');"); //在engine中讀取一張圖片 engEvalString(ep,"imshow(X)"); //顯示圖片 mxArray *X=engGetVariable(ep,"X"); //從engine獲得真正的數組X int ndims=mxGetNumberOfDimensions(X); //獲得這個數組的維數 cout<<ndims<<endl; int *dims=new int[ndims]; memcpy(dims,mxGetDimensions(X),ndims*sizeof(int)); //獲得數組每一維的大小 for (int i=0;i<ndims;i++) { cout<<dims[i]<<" "; } cout<<endl; /* double *p=(double*)mxGetData(X); //指向數組X的指針以便能訪問數組元素,圖像數據量太大,這里就不顯示了 for (int i=0;i<dims[0];i++) { for (int j=0;j<dims[1];j++) { cout<<p[i*dims[1]+j]<<" "; } cout<<endl; } */ delete[] dims; mxDestroyArray(X); cout <<"good job." <<endl; cin.get(); engClose(ep); //關閉Matlab引擎。 }
由於整個環境離不開matlab,所以程序還需相應的dll文件才能運行。
matlab的結構實在復雜,所以我也不太清楚究竟需要哪些dll,我就圖簡單了,直接把生成的文件移到了matlab可執行目錄下了。
通常是這個目錄:D:\Program Files\MATLAB\R2010b\bin\win32