版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Matlab2012a與VS2010(C+)混合編程經(jīng)歷了各種報錯和崩潰,用了近1個月的時間終于把C+的程序調(diào)通了。在編程過程中,我在網(wǎng)上找了各種Matlab和C+混編的資料,感覺混編的資料太少,故將自己編程的過程和心得分享給大家,希望能幫到和我一樣掙扎在混編領(lǐng)域中的同學(xué)。環(huán)境:windows8.1,Matlab2012a,VS2010需要編的C+程序要實現(xiàn)與Matlab一樣的功能,從鍵盤輸入數(shù)據(jù),獲得計算結(jié)果和圖像。如下圖:大概的過程:Matlab的m文件dllC+調(diào)用dll和Matlab中的engine(與圖像有關(guān),后面會詳細說明)輸出計算結(jié)果和圖像1.Matlab編譯器設(shè)置(電腦安裝有V
2、S2010)(1)mex命令設(shè)置(a) 運行 Matlab ,在 Matlab 的命令窗口 (Command Window) 鍵入“ mex -setup ”命令后,按回車鍵,安裝 Matlab 編譯器;(b) 命令窗口出現(xiàn)如下提示:Please choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers y/n?此時鍵入 “y” ,按回車;(c) 命令窗口出現(xiàn)如下提示:Please choose your compiler f
3、or building external interface (MEX) files:Would you like mex to locate installed compilers y/n? ySelect a compiler:1 Microsoft Visual Studio 2010 in G: Visual Studio 20100 None此時鍵入 ” 1” ,按回車 ;選擇 Microsoft Visual Studio 2010 的編譯器(d) 命令窗口出現(xiàn)如下提示:Please verify your choices:Compiler: Microsoft Visual St
4、udio 2010Location: G: Visual Studio 2010Are these correct?(y/n):此時鍵入 ”y” ,按回車 ;確認選擇 Microsoft Visual Studio 2010 的編譯器(2) mbuild 命令設(shè)置(a) 運行 Matlab ,在 Matlab 的命令窗口 (Command Window) 鍵入“ mbuild -setup ”命令后,按回車鍵,安裝 Matlab 編譯器;(b) 命令窗口出現(xiàn)如下提示:Please choose your compiler for building standalone MATLAB appli
5、cations:Would you like mbuild to locate installed compilers y/n?此時鍵入 ”y” ,按回車 ;(c) 命令窗口出現(xiàn)如下提示:1 Microsoft Visual Studio 2010 in G: Visual Studio 2010 0 None此時鍵入 “ 1” ,按回車 ;選擇 Microsoft Visual Studio 2010 的編譯器(d) 命令窗口出現(xiàn)如下提示:Please verify your choices:Compiler: Microsoft Visual Studio 2010Location: G:
6、 Visual Studio 2010Are these correct?(y/n):此時鍵入 ”y” ,按回車 ,確認選擇 Microsoft Visual Studio 2010 的編譯器,編譯器設(shè)置完成。2. 將 Matlab 函數(shù)轉(zhuǎn)成 DLL 函數(shù)(tips:能封裝成dll文件的m文件其內(nèi)容必須是自定義函數(shù)形式)函數(shù)文件 RE_1.m ,內(nèi)容如下:function f0,f1,f2=RE_1(S0,S1,S2) x = 0:0.01:2*pi;r =cos(3*x)/5 - (3*cos(6*x)/5 + (7*cos(20*x)/10 + sin(2*x)/10 + (3*sin(1
7、3*x)/10 + 10;r_max = max(r);r_min = min(r);r1=r_max;r2=r_min;f0=r1-r2; N=128;p1=19;p2=64; c0=1;c1=-sin(2*pi*p2/N)/sin(2*pi*(p2-p1)/N);c2=sin(2*pi*p1/N)/sin(2*pi*(p2-p1)/N);Sn=c0*S0+c1*S1+c2*S2; c=1,c1,c2; m=0,p1,p2; D=zeros(N); for i=1:N for j=1:3 if i+m(j)<=N D(i,i+m(j)=c(j); else D(i,mod(i+m(j)
8、,N)=c(j); end end endD; z=pinv(D); r=z*Sn;r_max=max(r);r_min=min(r);f1=r_max-r_min; g1=S0-r;r1=r(p1+1:end);r(1:p1);g2=(S1-r1)-(S0-r)*cos(2*pi*p1/N)/sin(2*pi*p1/N); a_sum=0;b_sum=0;for i=1:N a(i)=(g1(i)*sin(2*pi*(i-1)/N)-g2(i)*cos(2*pi*(i-1)/N)*sin(4*pi*(i- 1)/N); b(i)=(g1(i)*sin(2*pi*(i-1)/N)-g2(i)*
9、cos(2*pi*(i-1)/N)*cos(4*pi*(i-1)/N); a_sum=a_sum+a(i); b_sum=b_sum+b(i);end A1=2*a_sum/N;B1=-2*b_sum/N; s0_re=A1*cos(2*pi*0/N)+B1*sin(2*pi*0/N)+r(1);for i=1:N-1 s(i)=A1*cos(2*pi*i/N)+B1*sin(2*pi*i/N)+r(i+1); h_re(i)=s(i);end l=s0_re;h_re'r_re=double(l);r_re_max=max(r_re);r_re_min=min(r_re);f2=r_
10、re_max-r_re_min; end 函數(shù)文件 RE_2.m ,內(nèi)容如下:function R,R_re=RE_2(S0,S1,S2) N=128;p1=19;p2=64; c0=1;c1=-sin(2*pi*p2/N)/sin(2*pi*(p2-p1)/N);c2=sin(2*pi*p1/N)/sin(2*pi*(p2-p1)/N);Sn=c0*S0+c1*S1+c2*S2; c=1,c1,c2; m=0,p1,p2; D=zeros(N); for i=1:N for j=1:3 if i+m(j)<=N D(i,i+m(j)=c(j); else D(i,mod(i+m(j),
11、N)=c(j); end end endD; z=pinv(D); r=z*Sn; g1=S0-r;r1=r(p1+1:end);r(1:p1);g2=(S1-r1)-(S0-r)*cos(2*pi*p1/N)/sin(2*pi*p1/N); a_sum=0;b_sum=0;for i=1:N a(i)=(g1(i)*sin(2*pi*(i-1)/N)-g2(i)*cos(2*pi*(i-1)/N)*sin(4*pi*(i-1)/N); b(i)=(g1(i)*sin(2*pi*(i-1)/N)-g2(i)*cos(2*pi*(i-1)/N)*cos(4*pi*(i-1)/N); a_sum=
12、a_sum+a(i); b_sum=b_sum+b(i);end A1=2*a_sum/N;B1=-2*b_sum/N; s0_re=A1*cos(2*pi*0/N)+B1*sin(2*pi*0/N)+r(1);for i=1:N-1 s(i)=A1*cos(2*pi*i/N)+B1*sin(2*pi*i/N)+r(i+1); h_re(i)=s(i);end l=s0_re;h_re'r_re=double(l); i=0:2*pi/127:2*pi;I=0:pi/256:2*pi;R=spline(i,r',I);R_re=spline(i,r_re',I); en
13、d 這2個matlab程序很像,只是輸出值有所不同。我將RE_1.m封裝成接口為mwArray的dll文件;將RE_2.m封裝成接口為mxArray的dll文件。具體操作如下: 在 Matlab的 Command Window 下輸入命令 :命令 1 : mcc -W cpplib:RE_2 -T link:lib RE_2.m或命令 2 : mcc -W lib: RE_2-T link:lib RE_2.m(命令 1 生成的 DLL 函數(shù)接口的數(shù)據(jù)類型是 mwArray ,命令 2 生成的 DLL 函數(shù)接口的數(shù)據(jù)類型是 mxArray 。)生成動態(tài)鏈接庫DLL,編譯完成后,Matlab會在
14、當前文件夾生成一些文件:其中RE_2.dll,RE_2.h和RE_2.lib是所需要的3.VS2010編譯環(huán)境設(shè)置和工程創(chuàng)建(1).環(huán)境變量及VS2010編譯環(huán)境設(shè)置(以下地址是我的電腦中文件夾的地址) 環(huán)境變量:我的電腦屬性高級系統(tǒng)設(shè)置高級環(huán)境變量系統(tǒng)變量Path編輯添加:(以下是我的電腦中文件夾的地址)G:Matlab2012abinwin64G:Matlab2012aruntimewin64G:Visual Studio 2010VCbin(地址之間用;隔開,且;是英文下輸入的) VS2010編譯環(huán)境項目屬性1) 配置管理器活動解決方案平臺新建X642) VC+目錄包含目錄 添加:G:M
15、atlab2012aexterninclude庫目錄 添加;G:Matlab2012aexternlibwin64microsoft 鏈接器輸入附加依賴項mclmcrrt.libRE_1.libRE_2.liblibeng.liblibmx.liblibmat.lib(每一項之間用回車隔開)P.S: mclmcrrt.lib,RE_1.lib,RE_2.lib是與調(diào)用matlab生成的dll有關(guān)的;libeng.lib,libmx.lib,libmat.lib是調(diào)用matlab的engine,生成函數(shù)圖像有關(guān)的。(2)控制臺工程程序建立 在VS2010新建一個名為“RE_test”控制臺項目,
16、在應(yīng)用程序頁面選擇向?qū)е邪慈缦聢D設(shè)置: 把之前matlab生成的RE_1.dll, RE_1. H,RE_1.lib, RE_2.dll, RE_2.h, RE_2.lib這些文件復(fù)制到控制臺項目文件夾下 在解決方案資源管理器“源文件”右鍵添加新建項C+文件,命名為Test.cpp4.VS2010(C+)程序 程序內(nèi)容如下:#include<iostream>#include <string.h>#include "RE_1.h"#include "RE_2.h"#include <stdlib.h>#include
17、<stdio.h>#include "engine.h"using namespace std;int main() if(!RE_1Initialize() /初始化動態(tài)庫RE_1 cout<<"initilize failed"<<endl;return -1; /定義輸入值S0,S1,S2和輸出值f0,f1,f2 mwArray S0(128,1,mxDOUBLE_CLASS,mxCOMPLEX); mwArray S1(128,1,mxDOUBLE_CLASS,mxCOMPLEX); mwArray S2(12
18、8,1,mxDOUBLE_CLASS,mxCOMPLEX); mwArray f0(1,1,mxDOUBLE_CLASS); mwArray f1(1,1,mxDOUBLE_CLASS); mwArray f2(1,1,mxDOUBLE_CLASS); /從屏幕上獲取數(shù)據(jù),形成數(shù)組A,B,C int g; double A128,B128,C128; printf("請輸入0號傳感器數(shù)據(jù):n"); for(g=0;g<128;g+) scanf("%lf",&Ag); printf("請輸入1號傳感器數(shù)據(jù):n"); fo
19、r(g=0;g<128;g+) scanf("%lf",&Bg); printf("請輸入2號傳感器數(shù)據(jù):n"); for(g=0;g<128;g+) scanf("%lf",&Cg); /將數(shù)組A,B,C的值分別賦給S0,S1,S2 S0.SetData(A,128); S1.SetData(B,128); S2.SetData(C,128); RE_1(3,f0,f1,f2,S0,S1,S2);/調(diào)用函數(shù)進行運算 /獲取,顯示輸出值 double *a=new double; f0.GetData(a,
20、1); cout<<"設(shè)定圓的圓度誤差f0="<<*a<<endl; double *b=new double; f1.GetData(b,1); cout<<"分離圓的圓度誤差f1="<<*b<<endl; double *c=new double; f2.GetData(c,1); cout<<"重構(gòu)圓的圓度誤差f2="<<*c<<endl; getchar(); /關(guān)閉動態(tài)庫RE_1 delete a;delete b;
21、delete c; RE_1Terminate(); / if(!RE_2Initialize() /初始化動態(tài)庫RE_2 cout<<"initilize failed"<<endl;return -1; /定義輸入值SS0,SS1,SS2和輸出值R,R_re mxArray *SS0,*SS1,*SS2; mxArray *R=NULL,*R_re=NULL; /設(shè)定SS0,SS1,SS2的內(nèi)存空間 SS0=mxCreateDoubleMatrix(128,1,mxCOMPLEX); SS1=mxCreateDoubleMatrix(128,1,
22、mxCOMPLEX); SS2=mxCreateDoubleMatrix(128,1,mxCOMPLEX); /將數(shù)組A,B,C的值分別賦給SS0,SS1,SS2 memcpy(mxGetPr(SS0),A,128*sizeof(double); memcpy(mxGetPr(SS1),B,128*sizeof(double); memcpy(mxGetPr(SS2),C,128*sizeof(double); mlfRE_2(2,&R,&R_re,SS0,SS1,SS2);/調(diào)用函數(shù)進行運算 RE_2Terminate();/關(guān)閉動態(tài)庫RE_2 /Engine *ep;if
23、(!(ep = engOpen("0") /啟動matlab的引擎(engine) fprintf(stderr, "nCan't start MATLAB enginen"); return EXIT_FAILURE;/作設(shè)定圓的圖像engEvalString(ep,"x=0:0.01:2*pi;");engEvalString(ep, "v=10+1.2*cos(x)-0.8*sin(x)+0.1*sin(2*x)+0.2*cos(3*x)-0.6*cos(6*x)+0.3*sin(13*x)+0.7*cos(20*x);");engEvalString(ep, "polar(x,v);");engEvalString(ep, "hold on
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微機課程設(shè)計數(shù)值求和
- 銀行課程設(shè)計理財
- 課程設(shè)計寫什么好
- 速寫靜物組合課程設(shè)計
- 課程設(shè)計與教學(xué)研發(fā)
- 跳繩教學(xué)課程設(shè)計
- 課程設(shè)計與教學(xué)要求
- 課程設(shè)計用紙比例
- 隧道原理課程設(shè)計
- 綜合課程設(shè)計英文翻譯
- 奶茶督導(dǎo)述職報告
- 山東萊陽核電項目一期工程水土保持方案
- 白熊效應(yīng)(修訂版)
- 小學(xué)數(shù)學(xué)知識結(jié)構(gòu)化教學(xué)
- 視頻監(jiān)控維保項目投標方案(技術(shù)標)
- 社會組織能力建設(shè)培訓(xùn)
- 立項報告蓋章要求
- 2022年睪丸腫瘤診斷治療指南
- 被執(zhí)行人給法院執(zhí)行局寫申請范本
- 主變壓器試驗報告模板
- 安全防護通道施工方案
評論
0/150
提交評論