天天看點

vs 2010調用matlab dll顯示視窗核心代碼vs2010和Matlab R2012b 混合程式設計

 matlab代碼:

代碼下面有,添加滾動條的視窗,這個地方主要是一個事件,點選按鈕後,調用matlab代碼生成的dll進行運算,完後顯示的結果視窗顯示出來,完後移動視窗到指定位置

實作效果:

vs 2010調用matlab dll顯示視窗核心代碼vs2010和Matlab R2012b 混合程式設計

之前配置的過程主要參考了下面的連結:

<a target="_blank" href="http://blog.csdn.net/stardust94605/article/details/8972064">http://blog.csdn.net/stardust94605/article/details/8972064</a>

下面是文章内容:

思路:為了實作matlab與C++混合程式設計,采用由m檔案構造動态連結庫然後在visual studio中調用的方法。

本人系統:Windows 7旗艦版(32位),VS2010旗艦版,Matlab R2012b    隻有R2010b或以上版本才識别VS2010編輯器

1. matlab中dll建立

         1.1    m檔案編寫

          function [ yt ] = myfitline( x,y,m,xrange,t )

         %xy為坐标向量,m為多項式階數,xrange為顯示圖上面的坐标範圍,t為要求的坐标橫軸位置

         %   Detailed explanation goes here

         p=polyfit(x,y,m);%計算各階系數p1x^m+p2x^(m-1)+....+ pmx+ p(m+1)

         yy=polyval(p,xrange);%計算一個區域内的函數值用于畫圖

         yt=polyval(p,t);   %  計算指定x下的函數對應的y值

         plot(x,y,'r*',xrange,yy,'b')

         end

        1.2   設定編譯器

                     &gt;&gt; mex -setup   選擇VS2010

                     &gt;&gt; mbuild -setup  選擇VS2010

                     &gt;&gt; mcc -W cpplib:Myfitline -T link:lib myfitline     (這就建立好了)

              其中,mcc是Matlab提供的編譯指令,對于這一點,Matlab的幫助說明如下:

               -W lib:string link:lib其中-W是控制編譯之後的封裝格式,cpplib,是指編譯成C++的lib,cpplib冒号後面是指編譯的庫的名字,-T表示目标,

       link:lib表示要連接配接到一個庫檔案的目标,目标的名字是後面的myfitline,即你寫的m函數的名字。

              運作完之後,你的目錄下面,将會出現以下一些檔案:

              Myfitline.cpp

              Myfitline.exp

              Myfitline.dll

              Myfitline.exports

              Myfitline.h

              Myfitline.lib

              mccExcludedFiles.log

              readme.txt

              具體每一個檔案的意思,請查幫助,這裡隻說其中很有用的幾個:

              Myfitline.dll是編譯好的動态庫,myfitline這個函數封裝在裡面,Myfitline.h是對應的頭檔案,在C裡面調用這個函數的時候,需要include這個頭檔案,

       在這個頭檔案的最後,你可以看到下面的内容:

              extern LIB_Myfitline_CPP_API void MW_CALL_CONV myfitline(int nargout, mwArray&amp; yt, const mwArray&amp; x,

              const mwArray&amp; y, const mwArray&amp; m, const mwArray&amp; xrange, const mwArray&amp; t);             

              這就是myfitline的C函數的聲明。nargout表示輸出變量的個數,其他就是對應了m函數的幾個變量。

              注意,變量的類型是mwArray,這是Matlab提供的一個特殊的變量類型(在7.0的版本,編譯之後,變量類型是mxArray)。mwArray是一個類,具體可以查幫助。

2.系統環境配置

              Computer - &gt; Properties -&gt; Advanced system settings -&gt; Environment Variables -&gt; User Variables -&gt; path, 添加(MATLAB下為MATLAB

2012軟體安裝目錄)

              ...\MATLAB\extern\lib\win32\microsoft;

              ...\MATLAB\bin\win32

              Computer - &gt; Properties -&gt; Advanced system settings -&gt; Environment Variables -&gt; System Variables -&gt; path, 添加

              ...\MATLAB\runtime\win32;

              ...\MATLAB\bin;

              ...\MATLAB\extern\lib\win32\microsoft;

3.vs2010環境配置

            ①Property Pages -&gt; VC++ Directories -&gt; Include Directories, 添加(安裝目錄下)

            ...\MATLAB\extern\include\ 

            ②Property Pages -&gt; VC++ Directories -&gt; Library Directories, 添加

            ...\MATLAB\extern\lib\win32\microsoft

            ③Property Pages -&gt; C/C++ -&gt; General -&gt; Additional Include Directories, 添加

            ...\MATLAB\extern\include\

            ④Property Pages -&gt; Linker -&gt; General -&gt; Additional Library Directories, 添加

           ⑤Property Pages -&gt; Linker -&gt; Input -&gt; Additional Dependencies, 添加

                          libeng.lib

                          libmat.lib

                          libmex.lib

                          libmx.lib

                          mclmcrrt.lib

                          mclmcr.lib

                          Myfitline.lib

    4.vs2010下完成程式

               把剛才生成的*.h *.dll *.lib檔案複制到剛剛建立的工程的檔案夾下,并且用添加—現有項添加的工程中。(此處的*代表你的m檔案名稱)

               調用函數 myfitline的檔案前要

                            #include "mclmcr.h"

                            #include "matrix.h"

                            #include "mclcppclass.h"

                            #include "Myfitline.h”

              具體程式如下:

              void CNewFeatureofStormView::Onposition()

            {

                 // TODO: 在此添加指令處理程式代碼

                 if( !MyfitlineInitialize())

                 {

                     MessageBox(_T("初始化失敗"));

                  }

                 // 為變量配置設定記憶體空間,可以查幫助mwArray

                  mwArray mwX(5, 1, mxDOUBLE_CLASS); // 5,1表示矩陣的大小(所有maltab隻有一種變量,就是矩陣,

                  mwArray mwY(5, 1, mxDOUBLE_CLASS);//為了和Cpp變量接軌,設定成1*5的矩陣,mxDOUBLE_CLASS表示變量的精度)

                  mwArray mwM(1, 1, mxDOUBLE_CLASS);

                  mwArray mwXR(50,1, mxDOUBLE_CLASS);

                  mwArray mwYT(1,1, mxDOUBLE_CLASS);

                  mwArray mwT(1,1, mxDOUBLE_CLASS);

                  int x[5]={432,435,438,441,443};    //樣本點坐标

                  int y[5]={136,138,140,145,147};    //

                  int xr[50],m=3,t=446;           //參數設定

                  for (int i=400;i&lt;450;i++)

                  {

                      xr[i-400]=i;

                  }

                  mwX.SetData(x, 5);      //調用類裡面的SetData函數給類指派

                  mwY.SetData(y, 5);

                  mwM.SetData(&amp;m, 1);

                  mwXR.SetData(xr, 50);

                  mwT.SetData(&amp;t, 1);

                  myfitline(1,mwYT,mwX,mwY,mwM,mwXR,mwT);

                  double c = mwYT.Get(1, 1); //調用類裡面的Get函數擷取取函數傳回值

                  CString strNumber;

                  strNumber.Format(_T("%lf"),c);

                  MessageBox(strNumber, _T("坐标"));

                  // 後面是一些終止調用的程式

                  MyfitlineTerminate();

                  // terminate MCR

                 mclTerminateApplication();

            }