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

 

posted @ 2015-11-09 15:06  羽过天晴  阅读(3410)  评论(0编辑  收藏  举报