Matlab与C++混合编程

Matlab与C++混合编程

  • 一、Matlab与C++混合编程的方法

1、使用Mideva,只支持matlab6以前的版本。

2、使用Matlab引擎来调用m文件,但是必须在目标机器上安装matlab才行,不现实。

3、使用mcc将m文件编译成为C/C++代码,然后导入VC编译,因为常常生成很多源代码,使用很繁琐。

4、使用mcc将m文件编译为头文件、dll和lib然后导入VC编译。目前这是最可行的一种方法。因此采取这种方法。

  • 二、m文件编译为h、dll和lib文件

2.1 matlab连接C++编译器

  1. windows环境:(win10+VS2017+matlabR2017b)
  1. 配置环境变量,path中添加VS安装目录(bin、tools、IDE)
  2. 下载msvc2017.xml、msvcpp2017.xml文件(2017为vs版本),拷贝到matlab目录bin/win64/mexopts下
  3. Matlab命令窗口执行mex  –setup命令,选择“mex -setup C++”选项
  1. Linux环境(ubuntu18+gcc17+matlabR2016b)

A、Linux下应先安装gcc和build-essential:

$sudo apt-get install gcc

$sudo apt-get install build-essential

Matlab命令窗口执行mex  –setup命令,选择“mex -setup C++”选项

2.2 准备m文件

     创建testAdd.m函数文件,实现最简单的加法运算,输入两个参数,返回两数之和。

function c = testAdd( a,b )

c=a+b;

end

 

2.3 将m文件转换成h、dll和lib文件

Matlab命令行执行命令:

Mcc -W cpplib:testAddDLL -T link:lib testAdd

也可使用命令(mcc -l testAdd),生成名称为testAdd的h、dll和lib文件

生成testAddDLL.h、testAddDLL.dll、testAddDLL.lib并放入VS项目目录下

三、VC中使用matlab生成的h、dll、lib文件

3.1 VS环境准备(win10+VS2017+matlabR2017b)

A、电脑中添加Matlab运行环境: [电脑重启生效]

Path后面追加:C:\Program Files\MATLAB\R2017a\bin\win64

B、VS编译环境设置

项目-属性:

VC++目录-包含(include)目录(添加类似路径):

C:\Program Files\MATLAB\R2017a\extern\include

C:\Program Files\MATLAB\MATLAB Runtime\v92\extern\include

VC++目录-库(lib)目录(添加类似路径):

C:\Program Files\MATLAB\R2017a\extern\lib\win64\microsoft

C:\Program Files\MATLAB\MATLAB Runtime\v92\extern\lib\win64\microsoft

C:\Program Files\MATLAB\R2017a\extern\lib\win64\mingw64

C:\Program Files\MATLAB\MATLAB Runtime\v92\extern\lib\win64\mingw64

  链接器(linker)-输入(input):

testAddDLL.lib

libmx.lib

libmat.lib

libmwservices.lib

mclmcr.lib

mclmcrrt.lib

3.2 编写VS测试代码

基本步骤:

  1. 初始化混合编程环境
  2. 准备输入变量
  3. 调用matlab函数
  4. 测试输出
  5. 关闭环境

代码:

#include "testAddDLL.h"

using namespace std;

 

int main() {

    //初始化

    mclmcrInitialize();

    if (!mclInitializeApplication(NULL, 0)) return -1;

    if (!testAddDLLInitialize())   return -1;

 

    //定义输入变量,使用数组间接赋值,直接赋值会报错

    mwArray a_ptr(1, 1, mxDOUBLE_CLASS, mxREAL);

    mwArray b_ptr(1, 1, mxDOUBLE_CLASS, mxREAL);

    //输入变量赋值

    double data1[] = { 1.0 };

    double data2[] = { 2.0 };

    a_ptr.SetData(data1, 1);

    b_ptr.SetData(data2, 1);

 

    //定义输出变量

    mwArray c_ptr;

 

//调用matlab中的方法testAdd

    testAdd(1, c_ptr, a_ptr, b_ptr);// 输出参数的个数、输出参数、输入参数

 

//测试输出

    double a, b, c;

    a = a_ptr.Get(1, 1);

    b = b_ptr.Get(1, 1);

    c = c_ptr.Get(1, 1);

    cout << "input a:" << a << ", b:" << b << " ,output c = "<< c << endl;

 

//关闭

    testAddDLLTerminate();

    mclTerminateApplication();

   

    return 0;

}

测试结果输出:

 

四、调试时的问题

1、Debug错误:xsd_binder::MalformedDocumentError

原因:debug检查太严

解决方法:

属性-调试(debugging)-调试器类型(debugger type):自动(auto)修改成混合(mixed),并在调试中设置忽略并继续运行。

五:其他资料

mwArray: https://ww2.mathworks.cn/help/compiler_sdk/cxx/mwarray.html

 

猜你喜欢

转载自blog.csdn.net/pacificyang/article/details/81080052