【转】C++调用Matlab的.m文件
生活随笔
收集整理的這篇文章主要介紹了
【转】C++调用Matlab的.m文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文地址 Matlab是一個強大的數學計算/仿真工 具,其內置了很多實用的現成的函數,而且我們經常也自己定義很多m函數。但在很多情況下,我們不得不使用VC編程。那么,如何在VC中利用matlab的 資源呢? 在這里我簡要的以一個簡單的例子來說明一下如果在VC中調用matlab中定義的.m文件。繁多的理論就不說了,簡明扼要的說一個實例。相信大家看過之后 都會馬上學會的 其中灰色底顯示的部分是需要我們手工輸入的部分。 步驟如下: ㈣將.m文件編譯為動態鏈接庫
這一步比較關鍵。在這一步中,將matlab中的.m文件轉換為dll。 在matlab命令行中輸入: mcc -t -h -L C -W lib:ppp -T link:lib myfunct.m 至此,可以發現在myfunct.m所在的目錄中產生了一大堆文件。我們只用其中3個: ppp.h??? ppp.lib???? ppp.dll ?㈤ 測試與調用
1. 新建一個VC工程。這里取名為mat。為了簡單,我們在這里建立一個對話框來進行演示。如下: ?
然后,將上面這3個文件拷貝到VC工程所在的目錄中,以便VC調用之。 ? 2. 進行VC編程。 首先,在cpp文件中加入:?#include “ppp.h”; 然后,設置VC的鏈接庫。在project-settings-link下的object/library modules中加入: ppp.lib;libmx.lib;libmatlb.lib;libmmfile.lib; ? 至此,VC的編譯環境設置完畢。下面就是編程部分了。 3.?編程部分的關鍵:接口和數據類型的轉換 先給出VC實現的源代碼:
運行報錯:e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) : error C2065: 'REFCLSID' : undeclared identifier
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) : error C2146: syntax error : missing ')' before identifier 'clsid'
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) : error C2182: 'mclCLSIDtochar_proxy' : illegal use of type 'void'
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) : error C2059: syntax error : ')'
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1768) : error C2065: 'REFGUID' : undeclared identifier
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1768) : error C2146: syntax error : missing ')' before identifier 'guid'
未解決 沒有整理與歸納的知識,一文不值!高度概括與梳理的知識,才是自己真正的知識與技能。 永遠不要讓自己的自由、好奇、充滿創造力的想法被現實的框架所束縛,讓創造力自由成長吧! 多花時間,關心他(她)人,正如別人所關心你的。理想的騰飛與實現,沒有別人的支持與幫助,是萬萬不能的。
本文轉自wenglabs博客園博客,原文鏈接:http://www.cnblogs.com/arxive/p/5224537.html,如需轉載請自行聯系原作者
㈠當然是先建立matlab的m文件。
這里為了簡單起見,我在matlab中定義了一個函數, 其m文件如下: function y = add_zh(a,b)????? y=a+b 保存為myfunct.m㈡下面來對matlab編譯環境進行設置。
打開matlab,在命令行狀態下鍵入:mex-setup
然后出現如下提示: -------------------------------------------------------------------------------------- Select a compiler: [1] Borland C++Builder version 5.0 in C:\Program Files\Borland [2] Lcc C version 2.4 in F:\SOFT\SHARE\MATLAB65\sys\lcc [3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio [0] None ? Compiler: -------------------------------------------------------------------------------------- 這里我們選擇’3’。(如果使用其他的編譯器比如BCB,那么就可以相應的選擇’1’) 然后,繼續在命令行狀態下輸入: mbuild –setup -------------------------------------------------------------------------------------- Please choose your compiler for building standalone MATLAB applications:? Would you like mbuild to locate installed compilers [y]/n? y Select a compiler: [1] Borland C++Builder version 5.0 in C:\Program Files\Borland [2] Lcc C version 2.4 in F:\SOFT\SHARE\MATLAB65\sys\lcc [3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio [0] None ? Compiler: -------------------------------------------------------------------------------------- 這里需要幾步確認。大家按情況操作即可。㈢對VC的編譯器環境進行設置。
在Tools-options-directory里面設置include和lib的路徑,分別添加一項,指向matlab安裝目錄中的\extern\include和 \extern\lib㈣將.m文件編譯為動態鏈接庫
這一步比較關鍵。在這一步中,將matlab中的.m文件轉換為dll。 在matlab命令行中輸入: mcc -t -h -L C -W lib:ppp -T link:lib myfunct.m 至此,可以發現在myfunct.m所在的目錄中產生了一大堆文件。我們只用其中3個: ppp.h??? ppp.lib???? ppp.dll ?㈤ 測試與調用
1. 新建一個VC工程。這里取名為mat。為了簡單,我們在這里建立一個對話框來進行演示。如下: ?然后,將上面這3個文件拷貝到VC工程所在的目錄中,以便VC調用之。 ? 2. 進行VC編程。 首先,在cpp文件中加入:?#include “ppp.h”; 然后,設置VC的鏈接庫。在project-settings-link下的object/library modules中加入: ppp.lib;libmx.lib;libmatlb.lib;libmmfile.lib; ? 至此,VC的編譯環境設置完畢。下面就是編程部分了。 3.?編程部分的關鍵:接口和數據類型的轉換 先給出VC實現的源代碼:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | void?CMatDlg::OnButton1() {???????????//在matlab中定義的m文件:myfunct,其功能是完成兩個數的相加操作。 ????????????????CString str; ????????????UpdateData(true); ????????????pppInitialize(); ????????????//為了調用matlab中的函數,必須使用數組數據類型,并其后調用matlab函數將其轉化為矩陣格式(matlab的基本數據類型是矩陣) ????????????static?double?x1[1]={1.0}; ????????????static?double?x2[1]={2.5}; ????????????double?result; ????????????//調用matlab創建3個矩陣 ????????????mxArray *A=mclGetUninitializedArray(); ????????????mxArray *B=mclGetUninitializedArray(); ????????????mxArray *C=mclGetUninitializedArray(); ????????????//將C語言中的變量值賦給matlab中的矩陣 ????????????mlfAssign(&A,mlfDoubleMatrix(1,1,x1,NULL)); ????????????mlfAssign(&B,mlfDoubleMatrix(1,1,x2,NULL)); ????????????mlfAssign(&C,mlfMyfunct(A,B)); ????????????//將matlab中的矩陣的指針傳遞給C語言中的指向double的指針 ????????????double?* md=mxGetPr(C); ????????????result=md[0]; ????????????//釋放這些矩陣 ????????????mxDestroyArray(A); ????????????mxDestroyArray(B); ????????????mxDestroyArray(C); ????????????str.Format ("It is : %f",result); ????????????::AfxMessageBox(str); } |
?
相信看到里面的注釋,我們就明白的差不多了。 VC編程以實現對matlab函數的調用,例如VC中我們實現兩個double型的相加,則需要做上述的編程:首先定義兩個數組并存入我們要進行函數操作的數據(也就是所謂的實參);然后將這兩個數組轉換為matlab可以識別的矩陣;然后調用m文件中自定義的函數,對矩陣進行操作;最后將結果再轉回VC支持的數據格式: ??????????? double * md=mxGetPr(C); ??????????? result=md[0];????? 至此,經matlab函數處理過的數據已經存入了VC中的result變量。???????? ??????????? mlfAssign(&C,mlfMyfunct(A,B)); 大家可以看出來,在進行調用的時候,我們使用的是m文件的文件名myfunct,而不是m文件中定義的add_zh(a,b) 程序中,我們要實現1.0和2.5的相加運算,結果如下: 。。。運行報錯:e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) : error C2065: 'REFCLSID' : undeclared identifier
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) : error C2146: syntax error : missing ')' before identifier 'clsid'
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) : error C2182: 'mclCLSIDtochar_proxy' : illegal use of type 'void'
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) : error C2059: syntax error : ')'
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1768) : error C2065: 'REFGUID' : undeclared identifier
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1768) : error C2146: syntax error : missing ')' before identifier 'guid'
未解決 沒有整理與歸納的知識,一文不值!高度概括與梳理的知識,才是自己真正的知識與技能。 永遠不要讓自己的自由、好奇、充滿創造力的想法被現實的框架所束縛,讓創造力自由成長吧! 多花時間,關心他(她)人,正如別人所關心你的。理想的騰飛與實現,沒有別人的支持與幫助,是萬萬不能的。
本文轉自wenglabs博客園博客,原文鏈接:http://www.cnblogs.com/arxive/p/5224537.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的【转】C++调用Matlab的.m文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过配置ssh深刻理解puppet的语法
- 下一篇: RH442-3 队列技术