C++調用matlab計算


 

     在學習和應用中,會遇到許多用matlab寫的代碼,如果自己再重寫為其他的語言,將是一件費時費力的工作,我們可以將其編譯為dll文件或者轉換為c/c++代碼直接使用。C++程序中調用Matlab程序有兩大類方法:第一種是調用Matlab引擎,第二種是將m文件打包成dll文件在C++語言環境下調用。第一種方法這里不講。

一、安裝matlab及環境配置

1.1安裝過程

此處省略。

1.2環境配置

在調用dll時,有時會出現各種缺失文件的錯誤,這有可能是環境變量沒有配置好的原因。在系統變量中需要配置matlabMATLAB_JAVA環境變量,如果java虛擬機版本過低,還需要安裝和配置java的環境變量。

在系統屬性->高級->環境變量中找到系統變量

(1)添加“matlab”變量,值為matlab安裝路徑“C:\Program Files (x86)\MATLAB\R2011b”。  

Path變量里添加C:\Program Files (x86)\MATLAB\R2011b\bin\win32;

 

(2)添加“MATLAB_JAVA”變量,值為“C:\Program Files (x86)\Java\jre1.8.0_40”;

 

(3)如果java虛擬機版本過低,還需要安裝和配置java的環境變量。安裝java , 一般安裝為java 6.0 ;配置java環境變量 :JAVA_HOME=C:\Program Files (x86)\Java\jre1.8.0_40\bin 。將C:\Program Files (x86)\Java\jre1.8.0_40\bin加到系統變量的Path后面

 

二、編譯matlab源碼為c/c++代碼和dll文件

2.1matlab中配置c++編譯器及編譯代碼

(1)在matlab控制台輸入“mex -setup”,選擇“y”,然后選擇你要編譯成c/c++代碼的編譯器,matlab有默認Lccc++編譯器。這里選擇vc++2010的編譯器。

 

2)在matlab控制台輸入“mbuild-setup”,選擇“y”,然后選擇你要編譯成c/c++代碼的編譯器。

 

3)編譯代碼

     首先選擇matlab代碼的工作環境的目錄,然后在matlab控制台輸入編譯指令:

mcc -B cpplib:blindest blindest.m ascread.m smoothn.m ascwrite.m ascgrid.m

     這里是編譯成dll文件和c++源碼。其中blindest是要編譯的目標的名字,blindest.m ascread.m smoothn.m ascwrite.m ascgrid.m是要編譯的源程序的名字。這些matlab源碼是matlab函數,函數名和文件名要一樣,同一個文件里的主函數可以調用同一個文件里的子函數,也可以調用其他文件里的函數。如下圖matlab代碼

    

這樣就生成了c++的源碼和dll文件。你需要用到*.dll,*.h,*.lib文件復制到你將要新建的c++項目下。

 

4)其他編譯指令

指令:mcc -W lib:plotdata plotdata.m -T link:lib

指令:mcc -B csharedlib:plotdata plotdata.m 

這兩條指令和上面是等效的,都是編譯成c++dll文件。

指令:mcc -l blindest.m smoothn.m

這條指令是編譯為cdll文件。

指令:mcc -m  blindest.m smoothn.m

這條指令是編譯為c的可執行文件*.exe

2.2新建vs項目

(1)新建vs2010c++空項目或win32控制台項目,

    將頭文件和庫文件還有dll文件添加到新建項目目錄下,在新建的項目cpp文件中添加以下代碼,用來調用dll文件。

 1 #include "stdafx.h"
 2 // include matlab sys head file
 3 #include "mclmcr.h"
 4 //#include "matrix.h"
 5 //#include "mclcppclass.h"
 6 
 7 // include lib head file
 8 #include "blindest.h"//
 9 
10 // link matlab sys lib
11 //#pragma comment(lib, "mclmcrrt.lib")
12 //#pragma comment(lib, "libmx.lib")
13 //#pragma comment(lib, "libmat.lib")
14 #pragma comment(lib, "mclmcr.lib")
View Code

(2)配置項目庫文件

在包含目錄加入:C:\Program Files %28x86%29\MATLAB\R2011b\extern\include;

庫目錄加入:C:\Program Files %28x86%29\MATLAB\R2011b\extern\lib\win32\microsoft;

點擊連接器=>輸入,在附加依賴項中添加:

libeng.lib

libmx.lib

libmat.lib

mclmcr.lib

mclmcrrt.lib

blindest.lib

(3)寫調用代碼

   在生成的*.h文件中,會有一個函數對應matlab代碼的函數

blindest(const mwArray& optflag, const mwArray& optArgs, const mwArray& sflag, const mwArray& count, const mwArray& sArgs, const mwArray& tcount);

在自己的代碼中可以直接調用這樣的函數,函數參數類型為mwArray,具體查閱相關資料,如果是編譯為c代碼,只有函數參數類型為mxArray的函數,c++兩者都有。

參考資料:

1.http://blog.chinaunix.net/uid-21372424-id-316767.html

2.http://blog.csdn.net/c4501srsy/article/details/8129616

3.http://www.cnblogs.com/kmliang/archive/2012/08/29/2662943.html

4.http://blog.sina.com.cn/s/blog_59fabe030102vifr.html

5.http://m.blog.csdn.net/blog/hong__fang/43307701

示例代碼:

// include matlab sys head file
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
// include lib head file
#include "libCaculateFun.h"
// link matlab sys lib
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "mclmcr.lib")
// link lib
#pragma comment(lib, "libCaculateFun.lib")
void TestDeno()
{
     // init lib
     if (!(libCaculateFunInitialize()))
     {
        std::cout<<"Could not init lib !"<<endl;
        return -1;
     }
     double xxxx[2] = {0};
     double inin    = 0;
     double yyyy[2] = {0};
     double outo    = 0;
     // 為函數參數分配內存空間
     mwArray mwXX(1, 2, mxDOUBLE_CLASS);
     mwArray mwIn(1, 1, mxDOUBLE_CLASS);
     mwArray mwYY(1, 2, mxDOUBLE_CLASS);
     mwArray mwOut(1, 2, mxDOUBLE_CLASS);
     // 為輸入參數賦值
     mwXX.SetData(&xxxx, 2);
     mwIn.SetData(&inin, 1);
     // 調用計算函數
     CaculateFun(2, mwYY, mwOut, mwXX, mwIn);
     // 獲取輸出參數
     outo = mwOut.Get(1, 1);
     // lib Terminate   
     libCaculateFunTerminate();
     // MCR Terminate   
      mclTerminateApplication();
}

 

三、參考資料

1.http://www.cnblogs.com/xpvincent/archive/2013/02/05/2893046.html

2.http://lunan.iteye.com/blog/1279124

3.http://www.cnblogs.com/lidabo/archive/2012/08/24/2654148.html

4.http://blog.csdn.net/zouxy09/article/details/20553007

5.http://blog.sina.com.cn/s/blog_9db9f81901013yv2.html

6.http://www.cnblogs.com/mfryf/archive/2012/02/16/2354161.html

7.http://cn.mathworks.com/help/matlab/matlab_prog/string-evaluation.html

 


免責聲明!

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



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