MATLAB与C++混合编程之环境配置及测试详解

MATLAB作为科学计算的工具,目前已经广泛应用于计算机科学、数学科学、生物科学等领域,其拥有丰富的功能,在科学计算与数据可视化方面表现尤为突出,并且其编程简单。但是,由于MATLAB是一种解释型语言,其执行过程是编译一句,执行一句,并且,作为一种解释型语言,其不需要事先定义变量,这就要求其在运行的过程中不断地动态分配内存,这都限制了MTALAB的执行速度。C++刚好可以弥补其在速度上的缺陷,C++是代码一次性编译后,全部装载到内存中进行执行。并且可以利用C++来完成MATLAB不易完成的工作。因此,进行C++与MATLAB语言混合编程是十分有必要的。

简单介绍编译型语言与解释型语言的区别: 

用编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统(不仅仅只是通过编译器,编译器只是编译系统的一部分)把高级语言翻译成机器语言,把源高级程序编译成为机器语言文件,比如Windows下的.exe文件。以后就可以直接运行而不需要编译了,因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。

解释型语言编写的程序不需要编译。解释型语言在运行的时候才翻译,比如VB语言,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。

环境:Windows10  MATLAB R2018B   Visual Studio2017

一、环境配置

1、MATLAB内调用C++进行编程

打开MATALB,依次输入mex -setup C++mbuild -setup

MATLAB与C++混合编程之环境配置及测试详解_第1张图片

至此,使用MATLAB调用C++配置完成。

2、VS内调用MATALAB进行编程

视图——>属性页,添加目录。

(1)点击右边向下的箭头,选择编辑

MATLAB与C++混合编程之环境配置及测试详解_第2张图片

MATLAB与C++混合编程之环境配置及测试详解_第3张图片

MATLAB与C++混合编程之环境配置及测试详解_第4张图片

点击上图所示添加,选择C:\MATLAB\R2018b\extern\include目录

(2)同理,添加库目录为C:\MATLAB\R2018b\extern\lib\win64\microsoft,点击应用。效果如下:

MATLAB与C++混合编程之环境配置及测试详解_第5张图片

(3)在属性页-链接器-输入-附加依赖项中添加 libmat.lib;libeng.lib;libmx.lib;

MATLAB与C++混合编程之环境配置及测试详解_第6张图片

(4)在计算机——>右键——>属性——高级系统设置——环境变量中Path环境变量添加:C:\MATLAB\R2018b\bin\win32

C:\MATLAB\R2018b\bin\win64,效果如下:

MATLAB与C++混合编程之环境配置及测试详解_第7张图片

至此,在VS中编写MEX文件的配置就完成了。

确认以上步骤执行完成之后,重启计算机,使得某些配置生效。

二、测试环境配置

1、VS2017中进行测试

(1)打开VS2017,新建——>空项目

MATLAB与C++混合编程之环境配置及测试详解_第8张图片

(2)添加源文件,命名为test.cpp,源文件内容为

#include
#include
#include
#include"engine.h"       
// 添加matlab引擎库的头文件
// 导入相关lib库
#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
int main()
{
    Engine *ep;
    // 启动引擎
    if (!(ep = engOpen("\0")))
    {
        fprintf(stderr, "\n打开Matlab引擎失败!\n");
        return EXIT_FAILURE;
    }
    // 执行:
    int Nsample = 50;
    const double PI = 3.1415926;
    double *t = new double[Nsample];
    for (int i = 0; i < Nsample; i++)
    {
        t[i] = i * 2 * PI / Nsample;
    }
    mxArray *T = NULL, *result = NULL;
    T = mxCreateDoubleMatrix(1, Nsample, mxREAL);
    memcpy((void *)mxGetPr(T), (void *)t, Nsample * sizeof(t[0]));
    // 把变量T存入Matlab工作区
    engPutVariable(ep, "X", T);
    // 执行Matlab命令      
    engEvalString(ep, "Y=cos(X);");
    engEvalString(ep, "plot(X,Y);");
    engEvalString(ep, "title('y=cos(x)');");
    engEvalString(ep, "xlabel('x');");
    engEvalString(ep, "ylabel('y');");
    fgetc(stdin);
    // 清除对象,不能漏!
    mxDestroyArray(T);
    engEvalString(ep, "close;");
    // 关闭引擎,不能漏!
    engClose(ep);
    return EXIT_SUCCESS;
}

先不用理解代码的含义,直接运行即可。如果运行成功,结果如下,则说明配置成功。

MATLAB与C++混合编程之环境配置及测试详解_第9张图片

2、MATLAB中进行测试

(1)打开MATLAB,创建文件夹D:\HiMat

(2)文件夹HiMat下创建文件himatlab.cpp,该源文件内容为:

MATLAB与C++混合编程之环境配置及测试详解_第10张图片

#include "mex.h"
void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
  mexPrintf("hello matlab in C/CPP.\n");
}

理解:四个参数分别用来输出和输入数据

nlhs 输出参数个数,plhs 输出参数指针 

nrhs 输出参数个数,prhs 输出参数指针 

注意: 我们对输出和输入参数的操作都是通过指针的方式进行的。因为我们的计算结果是需要传递给MATLAB的,实际上我们传递的不是数据,而是指针。MATLAB可以通过这些指针,访问内存中的数据

(3)对(2)中写的文件进行编译,切换MATLAB使用命令mex  himatlab.cpp进行编译。编译完成之后,生成*.mexw64文件。(*表示文件名)

MATLAB与C++混合编程之环境配置及测试详解_第11张图片

(4)直接输入文件名,即himatlab或者himatlab()即可在MATLAB中调用使用C++编写的程序,推荐使用后者,执行结果如下。

MATLAB与C++混合编程之环境配置及测试详解_第12张图片

参考文献:

1.https://blog.csdn.net/qq_33353186/article/details/79146234

2.https://blog.csdn.net/bendanban/article/details/37830495

3.https://blog.csdn.net/guyuealian/article/details/73743654

你可能感兴趣的:(MATLAB)