Visual Studio和MATLAB混合編程,有兩種方法:編程
1 MATLAB調用C程序;windows
2 VS調用MATLAB(目前見到的都是VS,其餘編譯器如codeblocks,或不提供這項功能);數組
前一種是用MATLAB的mex命令調用VS或其餘編譯器,將以必定方式編寫出的C文件編譯成.mexw32(針對win32)或者.mexw64(針對win64),而後MATLAB就能夠用調用動態連接庫的方式,調用C程序。這一過程當中,只須要在安裝好編譯器的前提下,執行:服務器
mex -setup
和函數
mbuild -setup
並按照提示循序漸進地幫助MATLAB找到C編譯器就能夠了。遇到MATLAB找不到Visual Stdio的狀況時,可按照官方網站提供的方法,例如若是MATLAB找不到已安裝的Visual Studio 2013,則在visual-studio
http://www.mathworks.com/matlabcentral/fileexchange/44408-matlab-mex-support-for-visual-studio-2013--and-mbuild-網站
下載官方提供的文件,按照README的要求將文件複製到指定目錄下便可。ui
README:spa
The files * msvc120engmatopts.bat * msvc120opts.bat * msvc120opts.stp should be copied to C:\Program Files\MATLAB\R2013a\bin\win64\mexopts . The files * msvc120compp.bat * msvc120compp.stp should be copied to C:\Program Files\MATLAB\R2013a\bin\win64\mbuildopts .
另外一種是反過來,由VS去調用MATLAB,由於歸根結底,許多底層的代碼都依賴於C/C++語言,若是要使用MATLAB進行實時的數據處理,那麼必然是使用C/C++(從操做系統內核、套接字,或者設備)獲取數據,再調用MATLAB進行處理。切入正題:操作系統
1 首先正確地安裝好環境,以下是我使用的環境:
x86
Windows 7
VS2013
MATLAB R2010a(安裝目錄爲D:\MATLAB\R2010a)。
2 下面是VS路徑的包含:
右鍵項目—屬性—VC++目錄
—包含目錄,添加D:\MATLAB\R2010a\extern\include;(注意分號)
—庫目錄,添加D:\MATLAB\R2010a\extern\lib\win32\microsoft;
—C/C++(—常規),添加附加包含目錄D:\MATLAB\R2010a\extern\include\;
—連接器
—常規,添加附加庫目錄D:\MATLAB\R2010a\extern\lib\win32\microsoft;
—輸入,添加附加依賴項:libeng.lib;libmat.lib;libmex.lib;libmx.lib;mclmcrrt.lib;mclmcr.lib;
3 系統環境變量:PATH裏添加D:\MatLab\R2010a\bin\win32; 幫助VS找到MATLAB的提供的動態連接庫。
4 註冊MATLAB服務器:cmd,在D:\MatLab\R2010a\bin目錄下運行
matlab \regserver
大概是開啓MATLAB Server模式,接收VS的調用請求吧。
5 下面寫C/C++程序:
添加頭文件以及動態連接庫:
#include "engine.h" #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "libeng.lib") #pragma comment(lib, "libmx.lib") #pragma comment(lib, "libmat.lib")
打開引擎(引擎用來調用MATLAB):
Engine* pEng = NULL; if (!(pEng = engOpen(NULL))) { printf("Open matlab enging fail!"); getchar(); return -1; }
引擎打開函數openEng調用完畢後必定要檢查是否打開成功(相似雲malloc函數,申請完內存必定要檢查是否申請成功),由於就算pEng==NULL,在函數engEvalString執行中也不會拋出異常的,只會致使engGetVariable執行失敗,固然咯,由於根本沒執行嘛,哪來的variable?
而後能夠調用啦,一切的matlab命令均可以經過下面這個函數傳入MATLAB執行,相似於Linux的系統調用exec("...")和windows的system("..."):
engEvalString(pEng, "x=0:0.01:pi); y=sin(x); plot(x, y)");
若是要獲得MATLAB的返回結果:
engEvalString(pEng, "x=0:0.02:3.14; y=sin(x); plot(x, y)"); mxArray *x= engGetVariable(pEng, "x"); mxArray *y= engGetVariable(pEng, "y"); double * _x = mxGetPr(x); double * _x = mxGetPr(y); //此時_x爲x數組,_y爲y數組
因爲MATLAB裏面,數據都將當作矩陣來處理,所以返回結果也是以Array的方式返回,若是是單個值,就是array[0],不然爲array[0..n-1],如何獲得n呢?仍是用函數engGetVariable咯,能夠先執行n=length(x),再將n傳回。
執行結束後,記得關閉引擎:
if(pEng) engClose(pEng);
注意一旦關閉,就不能再使用pEng了,不然會拋出異常。而且,在關閉引擎後,本來在執行過程當中獲得的figures也會關閉。在個人課題裏面,引擎是在程序開始時打開,程序最終退出時才關閉。
6 若是在編譯期間出現「找不到XXX.lib」的狀況,檢查路徑是否正確添加,否則就直接複製lib文件到system32吧。。。
7 若是編譯連接經過,運行起來仍是有異常,檢查matlab server是否有註冊成功:運行matlab /regserver,再試一試。
8 由於調用MATLAB執行的命令是以字符串形式傳入的,千萬注意字符串裏面的特殊符號、空格。特殊符號前面須要加上反斜杆,如有空格,依據MATLAB的語法,應使用單引號。例如:
engEvalString(pEng,"cd \'E:\\Desktop\\Alilce and Bob\' ");
9 若是遇到ERROR LNK2019,如:
錯誤 1 error LNK2019: 沒法解析的外部符號 _mxGetPr,該符號在函數 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 錯誤 2 error LNK2019: 沒法解析的外部符號 _mxDestroyArray,該符號在函數 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 錯誤 3 error LNK2019: 沒法解析的外部符號 _engEvalString,該符號在函數 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 錯誤 4 error LNK2019: 沒法解析的外部符號 _engOpen,該符號在函數 _main 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 錯誤 5 error LNK2019: 沒法解析的外部符號 _engClose,該符號在函數 _main 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 錯誤 6 error LNK2019: 沒法解析的外部符號 _engGetVariable,該符號在函數 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 錯誤 7 error LNK1120: 6 個沒法解析的外部命令 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\Debug\matlab.exe 1 1 matlab
檢查MATLAB和VS是否運行在同一平臺上,若是MATLAB是x64,那麼配置管理器中必定要選中x64,不然選Win32:
右鍵項目——在配置管理器的下拉菜單裏選中正確的平臺,而後按照上面所述的過程從新配置路徑。
以上~