混合編程學習之一:VS2010調用MATLAB引擎


      最近在學習混合編程的相關知識,閑話不說,直接進入主題。

    本系列實驗基於MATLAB2010b 和VS2010 的平台,32位win7電腦。

      調用MATLAB加法程序add.m,步驟如下。

     (1)打開MATLAB2010b,出現如下界面。

    

      (2)創建函數文件add.m,並編寫程序如下。

     

      注意:m文件存放的位置,程序中指定的MATLAB當前工作路徑相匹配。

      在本實驗中MATLAB的默認當前工作路徑為C:\Program Files\MATLAB\R2010b.

     (3)打開VS2010軟件,並建立一個空的控制台程序工程。如下圖所示。

     

      注意:工程項目中主文件可以是.c文件也可以是.cpp文件,如果是.c文件,則所有變量的聲明,必須放在程序的最前面,否則會出現編譯錯誤。

      (4)設置C語言環境。

       這里主要有三個地方需要設置。右鍵選擇項目的屬性,彈出窗口如下圖所示。

       

      a) 選中VC++目錄,設置包含目錄為:

      C:\Program Files\MATLAB\R2010b\extern\include

      b)選中VC++目錄,設置庫目錄為:

      C:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft

      c)選中鏈接器菜單下的輸入選項,添加附加依賴項。

      libeng.lib、libmx.lib、libmat.lib、libmex.lib.

      這四個庫文件對應着我們使用的四類函數:MATLAB引擎相關函數、mxArray相關函數、mat文件相關函數、mex相關函數,對應的頭文件為:engine.h、matrix.h、mat.h、mex.h

注意:設置編譯環境庫目錄時,也可以在鏈接器常規下面的附加庫目錄里設置,只對本項目有效(經過驗證,兩者的效果是一樣的,網上解釋說:前者是針對所有的,后者只是針對C/C++編譯器的,所以如果只用到了該編譯器,則效果是相同的)。另外,需要增加windows系統的path環境變量:

C:\Program Files\MATLAB\R2010b\bin\win32,具體設置參見網上教程。設置之后,重啟電腦,並在DOS命令框里輸入ECHO %PATH%查看是否設置成功,結果如下圖所示。

      

     (5)編寫主程序如下。

      #include <stdio.h>

      #include <stdlib.h>

      /******加載MATLAB相關函數運行所需頭文件********/

      #include <engine.h>

      #include <matrix.h>

      #include <mat.h>

      #include <mex.h>

 

      //主程序入口

     void main()

     {

         Engine *ep = engOpen(NULL);      //打開精簡版MATLAB

        

         mxArray *a = mxCreateDoubleMatrix(1,1,mxREAL);         //創建mxArray類型變量

         mxArray *b = mxCreateDoubleMatrix(1,1,mxREAL);

 

                  

 

         double *aval = (double *)mxCalloc(1, sizeof(double));       //申請靜態存儲空間

         double *bval = (double *)mxCalloc(1, sizeof(double));

         aval[0] = 1;

         bval[0] = 2;

 

         mxFree(mxGetPr(a));            //使用mxSetPr函數前,必須先釋放空間

         mxSetPr(a, aval);

 

         mxFree(mxGetPr(b));

         mxSetPr(b, bval);

            

         flag =engEvalString(ep, "cd  ./work");                  //向MATLAB發送字符串命令

                                                     //修改工作路徑

         engPutVariable(ep, "a", a);       //將變量傳入到MATLAB空間中

         engPutVariable(ep, "b", b);

 

         engEvalString(ep, "s=add(a,b);");                      //求和

         engEvalString(ep, "save test.mat;");                    //保存所有變量

 

         mxArray *s = engGetVariable(ep, "s");                  //將MATLAB變量傳回VS空間

         printf("s=%f", *mxGetPr(s));      //打印結果

 

         engClose(ep);                 //關閉精簡版MATLAB

         mxDestroyArray(a);            //釋放mxArray變量

         mxDestroyArray(b);

         system("PAUSE");             //屏幕暫留

      }

     (6)結果如下圖所示。

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM