c++調用matlab程序


Matlab c++混合編程方法

開發環境:win7 64+vs2010+matlab

如果想要讓matlab調用c++的函數類,則需要把c++編譯成mex文件,使用這個方法可以實現混合調試。不過我認為學習c++matlab混合編程一般是通過c++調用matlab函數,因為matlab具有強大的數學函數庫,然而vc++具有界面設計靈活的優點,因此這里只介紹通過vc++調用matlab的方法。

(1)環境配置搭建

  • matlab配置:開始前matlab需要先安裝兩個編譯插件,這個安裝直接在matlab命令窗口中敲入分別輸入命令:

>>mex -setup 

>>mbuild –setup 






安裝過程中要么直接回車,要么選擇相關的編譯器。

  • vc++項目配置:安裝完畢之后,配置c++程序中的包含目錄、庫目錄這個對應於你的電腦matlab的安裝位置分別把.h和lib文件指向..\extern\include、..\extern\lib\win64\microsoft.




除此之外還要在”鏈接器-》附加依賴項 “ 中加入調用eigin所需的庫libmx.lib、 libmat.lib、libeng.lib,以及調用mwArray所需的類的庫mclmcrrt.lib,mwArray是連接c++與matlab所需的 矩陣類,如果不懂這個類的使用需要先網上查看一下用法。同時還要在系統壞境變量中,添加matlab的動態鏈接庫.dll文件所在的位置,這個就在matlab安裝位置的bin目錄下。

(2)程序調用

接着就要開始學習如何通過c++調用matab的函數庫了,這個調用方法有兩個:

第一種方法:c++中直接調用matlab的計算引擎eigin。

在調用的文件中添加eigin頭文件:

#include <engine.h>

然后在程序想要引用matlab的地方調用eigin函數:

Engine *ep;
ep=engOpen(NULL);
engEvalString(ep,"x=0:0.05:2*pi;y=sin(x);plot(x,y,'.b')");


我這里是通過c++調用matlab,來繪制一個正玄函數作為例子,在engEvalString函數就是輸入命令函數的代碼,當然這個函數可以每次在輸入的字符串當中只有一條命令,然后多次調用engEvalString函數,你也可以直接把所有的matlab函數代碼直接當做一個字符串,輸入engEvalString函數中。測試一下調用結果:


我在例子中通過mfc對話框的open按鈕,打開讀取圖片,並且調用matlab函數的繪制函數,可以看到同時出現了mfc與matlab繪制窗口的共存。我最喜歡用matlab與c++混合編程的原因就是這個,c++邏輯調試比較難,但是如果由matlab顯示c++程序運行中一些數據的變化結果進行調試,那就相當爽了。

這種調用eigin的方法缺點在於要求運行程序的電腦中裝有matlab,這個方法我比較不喜歡,因為在公司上班的時候,經常要把自己的demo結果發給其他人測試,而其它人的電腦上沒有裝matlab,這樣就調用不了matlab的eigin

第二種方法:使用把matlab函數生成為動態鏈接庫,然后在c++中調用該動態鏈接庫:這里測試一下通過c++輸入數據給matlab,這些數據是一個圖片的其中一個通道數據,然后在matlab中顯示該單通道圖片,最后把數據返回給c++。采用這種方法就要用到mwArray類實現數據傳輸了。

matlab圖片數據顯示函數

  • [c++]  view plain copy
    1. function [ output_args ] = test( input_args )  
    2. [n m]=size(input_args);  
    3. A=uint8(input_args');  
    4. imshow(A);  
    5. output_args=[3,4,5];  
    6. end  
      
然后在matlab的命令窗口輸入如下命令:
>>mcc -W cpplib:plotsintest -T link:lib test.m
將生成名字為:plotsintest的動態鏈接庫、靜態鏈接庫、頭文件,最后再vs中,屬性》鏈接器》附加依賴項》
plotsintest.lib
mclmcrrt.lib
libmx.lib
libmat.lib
libeng.lib


然后在c++中加入頭文件plotsintest.h,然后在程序運行的地方調用代碼為:
     
[c++]  view plain copy
  1. if( ! mclInitializeApplication(NULL,0) )  
  2. {          
  3.     fprintf(stderr, "Could not initialize the application.\n");  
  4.     exit(1);  
  5. }  
  6.   
  7. if (! plotsintestInitialize() )  
  8. {  
  9.     fprintf(stderr,"Could not initialize the library.\n");  
  10.     exit(1);  
  11. }  
  12. int width=m_pOrignImage->GetWidth();  
  13. int heigth=m_pOrignImage->GetHeight();  
  14. double *r=new double[heigth*width];  
  15. for (int i=0;i<heigth*width;i++)  
  16. {  
  17.     r[i]=((BYTE*)lockData.Scan0)[i*4];  
  18. }  
  19. mwArray X(width,heigth,mxDOUBLE_CLASS);//定義輸入X;  
  20. mwArray Y;//(width,heigth,mxDOUBLE_CLASS);//定義輸入Y;  
  21. X.SetData(r,heigth*width);  
  22. test(1,Y,X);  
  23. plotsintestTerminate();  
  24. mclTerminateApplication();  


最后顯示結果為:

可以看到,mfc對話框讀取顯示圖片,同時matlab出現了繪制figure窗口。原文地址:http://blog.csdn.net/hjimce/article/details/44904271    作者:hjimce     


免責聲明!

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



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