C++ Matlab混合编程
在C++开发过程中,可能需要C++和MATLAB混合编程,比如:别人只会MATLAB,需要和我们的C++一起运行;或者有部分MATLAB/Simulink开发的模块或者函数,需要快速整合到C++中。那么通常我们会考虑以MATLAB为主程序调用C++代码或者以C++为主程序调用MATLAB代码的方式。
MATALB官方提供了多种MATLAB与其他语言混合编程的方法,对于C++与MATLAB的混合编程包括下面两种:
C++调用MATLAB:用于C++的MATLAB引擎API:将MATLAB函数编译为C++动态库
MATLAB调用C/C++:MATLAB调用C++ MEX函数通过calllib调用C/C++动态库!
C++调用MATLAB
用于C++的MATLAB引擎API将MATLAB函数编译为C++动态库,然后在VS中调用;编译器版本为VS2015和MATLAB2023a,使用c++代码调用MATLAB编译生成的dll动态链接库。
在MATLAB中新建一个m文件,在m文件中创建一个加法函数;
将创建的.m文件,编译成.dll文件,以供C++调用。在MATLAB命令行窗口中,输入如下指令:“mcc -W cpplib:test2 -T link:lib test2.m”,编译成功后,生成如下文件夹:
我们主要用到.dll、.lib、.h文件;
1.环境配置
(1) 在系统环境变量的Path中添加“Matlab安装目录\bin\win64;”
(2) 在项目属性中的 VC++目录下的 包含目录添加“Matlab安装目录\extern\include;”
(3) 在项目属性中的 VC++目录下的 库目录添加“Matlab安装目录\extern\lib\win64\microsoft;”
(4) 项目属性–链接器—输入----附加依赖项-中添加以下库名
test2.lib
libmx.lib
libmat.lib
mclmcr.lib
mclmcrrt.lib
(5) 把MATLAB编译生成的.dll、.h、.lib文件拷贝到vs项目中.cpp同级目录下。
2.c++程序编写
程序代码如下:
#include
#include"matrix.h"
#include"test2.h"
using namespace std;
int main()
{
//初始化
mclmcrInitialize();
if (!mclInitializeApplication(NULL, 0))
return -1;
if (!test2Initialize())
return -1;
double a[3][4] = { {1,1,1,1},{1,1,1,1},{1,1,1,1} };
double b[3][4] = { { 2,2,2,2 },{ 2,2,2,2},{ 2,2,2,2 } };
//定义输入、输出变量,使用mwArray数组间接赋值,直接赋值会报错
mwArray a1(3, 4, mxDOUBLE_CLASS, mxREAL);
mwArray b1(3, 4, mxDOUBLE_CLASS, mxREAL);
mwArray c1(3, 4, mxDOUBLE_CLASS, mxREAL);
//把数组a,b赋值给数组a1,b1
for (int i=0;i<3;i++)
{
for (int j = 0; j < 4; j++)
{
a1(i + 1, j + 1) = a[i][j];
b1(i + 1, j + 1) = b[i][j];
}
}
//调用matlab函数,1:返回值个数;c1返回矩阵;a1,b1输入矩阵;
test2(1, c1, a1,b1);
//显示返回的数组c1
for (int i = 0; i<3; i++)
{
for (int j = 0; j < 4; j++)
{
cout << c1(i + 1, j + 1) << " " ;
}
cout << endl;
}
//使用完库必须关掉
test2Terminate();
mclTerminateApplication();
system("pause");
return 0;
}
运行结果:
3.可能遇到的问题:
问题解决:
MATLAB调用C++
1. 在VS2015中的操作
在Vs2015中建立动态链接库,在头文件和源文件中分别添加头文件和源文件(代码如下所示),注意动态链接库需要在release模式下生成。
头文件matdll.h文件:
#pragma once
#ifndef MATDLL_H
#define MATDLL_H
#ifdef __cplusplus
extern “C”
{
#endif
//自定义输出函数
__declspec(dllexport) double add(double x, double y);
#ifdef __cplusplus
}
#endif
#endif
源文件:matdll.cpp:
#include “matdll.h” double add(double x, double y) { return (x + y); }
2. 在MATLAB中的操作
首先新建一个目录,在目录下添加mtest.m文件,代码如下,将动态链接库MatDll.dll文件拷贝至目录。
mtest.m文件内容:
clc
clear
mex -setup;
mex -setup c++;
loadlibrary(‘MatDll.dll’,‘matdll.h’);
a=calllib(‘MatDll’,‘add’,3.4,2.00);%调用c++动态链接库来计算
b=calllib(‘MatDll’,‘add’,5.4,2.00);%调用c++动态链接库来计算
Matlab运行结果如下: