C++ Matlab混合编程

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运行结果如下:
在这里插入图片描述

  • 35
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值