C/C++ 中呼叫matlab 的兩種方式
matlab中在數值計算方面有很大優勢,如:矩陣計算 求解方程等。
在C/C++開發中,我們實現相同的功能往往很複雜,我們可以在C/C++開發環境下呼叫matlab進行混合程式設計。
下面主要介紹環境配置相關的說明。
注:
我的本地測試環境是
VS2008
WIN7 64位
matlab 2011b 32位
1. 配置VS2008
開啟VS "工具" -> "選項" -> "VC++目錄" 按照下面兩個圖 新增標頭檔案和庫檔案。
注:這個配置只需要做一次就可以了。
2. matlab配置
在command window輸入:
mex -setup
很可能會報錯,提示缺少64 compiler。OK,需要在安裝VS時選一下64位編譯器。
安裝好了之後,重新執行上面那個命令,直至出現Done.即可。如圖:
接著執行mbuild -setup 結果如圖:
3. 配置Windows環境變數。
為Windows環境變數中的系統變數(S)加上下面這兩項:
D:\Program Files\MATLAB\R2011b\bin 【這一項安裝完matlab會預設加上】 和
D:\Program Files\MATLAB\R2011b\bin\win64【這個也可以是win32 看自己的環境】
如果不配置這個的話,編譯連結都沒問題,執行時會報錯的,提示找不到各種DLL,(心累////
接著,我們就可愉快地使用C呼叫matlab了。
一般有兩種方式:
呼叫matlab引擎 和 呼叫matlab函式生成的DLL。
第一種:呼叫matlab引擎
首先需要引標頭檔案 #include "engine.h" 這個檔案在 %MATLAB_PATH%\extern\include裡,我們在VC++目錄包含過了。
否則,就會提示 cannot find engine.h file之類的錯誤。
然後,我們需要引用幾個函式呼叫依賴庫(lib) libeng.lib libmx.lib libmat.lib。
#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
否則連結時會報錯 無法解析的符號之類的錯誤。
之後我們就可以呼叫引擎了。
和檔案操作類似:開啟 操作 關閉。
開啟引擎:
Engine *ep;
if (!(ep = engOpen("\0")))
{
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
定義變數需要轉換為matlab的格式。比如使用:mxCreateDoubleMatrix 和 memcpy函式。
將資料傳入引擎使用:engPutVariable()。
接著呼叫 engEvalString(ep, "matlab指令")matlab的指令作為引數進行操作。
計算操作等完成後需要清理操作:
mxDestroyArray()函式清理mxCreateDoubleMatrix 生成的變數。
engClose()關閉引擎。
下面給出一個繪圖的例子:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h" // add header file
// import necessary lib
#pragma comment( lib, "libeng.lib")
#pragma comment( lib, "libmx.lib")
#pragma comment( lib, "libmat.lib")
int main(void)
{
Engine *ep;
// open engine
if (!(ep = engOpen("\0")))
{
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
// generate variables
int Nsample = 50;
const double PI = 3.1415926;
double *t = new double[Nsample] ;
for(int i = 0; i < Nsample; i++)
{
t[i] = i * 2 * PI / Nsample;
}
mxArray *T = NULL, *result = NULL;
T = mxCreateDoubleMatrix(1, Nsample, mxREAL);
memcpy((void *)mxGetPr(T), (void *)t, Nsample*sizeof(t[0]));
engPutVariable(ep, "T", T); // put data to engine
// execute matlab operations
engEvalString(ep, "Y=sin(T);");
engEvalString(ep, "plot(T,Y);");
engEvalString(ep, "title('y=sin(t)');");
engEvalString(ep, "xlabel('t');");
engEvalString(ep, "ylabel('y');");
printf("Hit return to continue\n");
fgetc(stdin);
// clean operation(don't forget!!!)
mxDestroyArray(T);
engEvalString(ep, "close;");
// close engine
engClose(ep);
return EXIT_SUCCESS;
}
執行結果如圖:【第一次執行程式會比較慢。】
第二種:呼叫matlab函式匯出的DLL
參考:
http://blog.163.com/rongting_chen/blog/static/164906844201252354518462/
在此感謝。