主要是透過Matlab engine 來呼叫 Matlab 提供的函式。
其實不只可以呼叫Matlab來畫圖,也可以直接呼叫 Matlab 提供的數學函式來運算,只是速度有沒有比較快就不知道了,沒有實際去測試過。
【環境設定】
如果是用Visual Studio來寫這樣子的程式的話,要先設定一些專案的屬性
Include
{MATLAB_PATH}\extern\include
{MATLAB_PATH}\extern\include\win32
{MATLAB_PATH}\simulink\win32
Lib
{MATLAB_PATH}\lib\win32\microsoft
{MATLAB_PATH}\lib\win32\
連結器->命令列
libeng.lib libmat.lib libmx.lib libmex.lib
{MATLAB_PATH} 是安裝Matlab 的路徑
【標頭檔】
要 #include "engine.h"
【撰寫程式】
用Matlab 提供的範例程式,這是一個畫出加速度的圖
Engine *ep;
mxArray *T = NULL;
double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };
if (!(ep = engOpen("\0"))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
T = mxCreateDoubleMatrix(1, 10, mxREAL);
memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));
engPutVariable(ep, "T", T);
engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
engEvalString(ep, "plot(T,D);");
engEvalString(ep, "title('Position vs. Time for a falling object');");
engEvalString(ep, "xlabel('Time (seconds)');");
engEvalString(ep, "ylabel('Position (meters)');");
mxDestroyArray(T);
engClose(ep);
宣告Matlab engine 以及會用到的變數
Engine *ep;
mxArray *T = NULL;
確定Matlab engine開啟成功
if (!(ep = engOpen("\0"))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
建立Matlab的陣列,mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);建立 m * n 的陣列,看是要 real(mxREAL) 或者 complex(mxCOMPLEX)
如果只是要一個單純的變數,mxCreateDoubleMatrix(1, 1, mxREAL)就可以了。
T = mxCreateDoubleMatrix(1, 10, mxREAL);
將數值複製給剛剛宣告的變數
memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));
將變數T傳給Matlab的變數
第二個變數 "T" 是在 Matlab 所使用的變數
第三個變數 T 是在 C 裡面用的變數
engPutVariable(ep, "T", T);
執行 Matlab 的指令,第二個變數是要在 Matlab 要執行的指令
所以看想要在Matlab 做什麼動作,畫圖、數學運算,都可以在這邊進行。
engEvalString(ep, "Matlab 的指令");
engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
engEvalString(ep, "plot(T,D);");
engEvalString(ep, "title('Position vs. Time for a falling object');");
engEvalString(ep, "xlabel('Time (seconds)');");
engEvalString(ep, "ylabel('Position (meters)');");
最後,清空記憶體以及關閉 engine
mxDestroyArray(T);
engClose(ep);
參考資料
Calling MATLAB software from C
8 則留言:
你好,我想請教您,按照你的步驟做了以後,我出現terminal server remote client not allowed,請問你知道這是什麼原因嗎?
不知道你是不是用遠端桌面使用MATLAB?
好像用遠端桌面使用MATLAB會有這樣的情況發生
首先很感謝你的分享~~
但目前我有一個疑問
就是我就值從C++傳給matlab做運算後,
我想把運算完的值再傳回C++
那我該怎麼做??
年代久遠了
基本上我都是從官方網頁找到的資料
這邊有滿多範例可以參考,讀單一變數或者多維陣列都有範例
http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_external/exampleindex.html
我去查了你提供的網址,有找到engGetVariable的指令把值從matlab傳回C
但是因為是mxArray的關係,傳回C印出來會是二進位的模式。
那你知道該如何把在matlab裡的矩陣~傳回C後,該用甚麼指令將mxArray轉成C可以印出來的模式
我沒有用過以C為主呼叫matlab運算之後回傳值的,只有叫matlab畫圖
另外用過以matlab為主,呼叫C寫成的mex-file
matlab傳array給C,將值從matlab印出
請問一下~~~為什麼用照你的方法用MATLAB R2010a失敗,似乎是在VC2008找不到MATLAB的dll檔。
但是相同的方法在MATLAB 7及MATLAB R2008a都沒有問題。
你知道為什麼嗎??
我反覆試過很多次了!!
請問 Visual 2012 呼叫 matlab R2014a也是用一樣的步驟嗎? 我用起來不能跑..
張貼留言