混合编程学习之一:VS2010调用MATLAB引擎

时间:2021-08-03 21:28:26

      最近在学习混合编程的相关知识,闲话不说,直接进入主题。

    本系列实验基于MATLAB2010b 和VS2010 的平台,32位win7电脑。

      调用MATLAB加法程序add.m,步骤如下。

     (1)打开MATLAB2010b,出现如下界面。

    混合编程学习之一:VS2010调用MATLAB引擎

      (2)创建函数文件add.m,并编写程序如下。

      混合编程学习之一:VS2010调用MATLAB引擎

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

      在本实验中MATLAB的默认当前工作路径为C:\Program Files\MATLAB\R2010b.

     (3)打开VS2010软件,并建立一个空的控制台程序工程。如下图所示。

      混合编程学习之一:VS2010调用MATLAB引擎

      注意:工程项目中主文件可以是.c文件也可以是.cpp文件,如果是.c文件,则所有变量的声明,必须放在程序的最前面,否则会出现编译错误。

      (4)设置C语言环境。

       这里主要有三个地方需要设置。右键选择项目的属性,弹出窗口如下图所示。

       混合编程学习之一:VS2010调用MATLAB引擎

      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%查看是否设置成功,结果如下图所示。

      混合编程学习之一:VS2010调用MATLAB引擎

     (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)结果如下图所示。

      混合编程学习之一:VS2010调用MATLAB引擎