C/C++与MATLAB混合编程笔记
1. 简介
C/C++和MATLAB之间的混合编程可以是:C/C++编程的过程中调用MATLAB,也可以使MATLAB编程过程中调用C/C++程序。前段时间了解了一下在C/C++程序中调用MATLAB的方法。这其中又分为两类:通过DLL方式调用MATLAB程序、通过MATLAB引擎调用MATLAB进行运算,其中仅仅是按照学长要求触及了一下通过MATLAB生成DLL为C提供运算支持的方法。
2. MATLAB生成DLL
- 准备被封装函数(这里以一个简单的
c=a+b
作为演示)
function [c]=add(a,b)
c = a+b;
end
-
命令行运行命令
deploytools
-
在弹出的对话框选择
Library Compiler
-
在打开的会话框中选择
C++ Shared Library
,点击右侧小加号,添加你的matlab文件(我这里是add.m
)
-
点击Package,进行封装
-
生成的文件夹中包含三个子文件夹
for_redistribution
、for_redistribution_files_only
、for_testing
,其中for_redistribution_files_only
中包含的文件就是所需文件add
├── for_redistribution
├── for_redistribution_files_only
│ ├── add.dll
│ ├── add.h
│ ├── add.lib
│ ├── default_icon.ico
│ └── readme.txt
├── for_testing
└── PackagingLog.html
3. C/C++调用DLL
-
设置Visual Studio项目属性(以Vs2017为例)
- 设置平台为x64(因为我的matlab是64位版,所以设置为x64,32位为x86)
- 在
VC++ --> 包含目录
添加Your_MATLAB_PATH\extern\include
- 在
VC++ --> 库目录
添加Your_MATLAB_PATH\lib\win64\microsoft
-
将生成的
add.dll
、add.lib
、add.h
放入C项目文件夹 -
编写C程序
#include "stdafx.h" #pragma comment(lib, "mclmcrrt.lib")//引入的mat库文件 #pragma comment(lib, "mclmcr.lib")//同上 #pragma comment(lib, "add.lib")//自己的库文件 #include "add.h"//自己的头文件 using namespace std; int main() { double a =1 ,b = 2;//设置a,b的值 //初始化matlab函数 addInitialize(); //创建matlab的数据类型(matlab中基本的数据类型是double的矩阵) mwArray mat_a(1,1,mxDOUBLE_CLASS); mwArray mat_b(1,1,mxDOUBLE_CLASS); mwArray mat_c(1,1,mxDOUBLE_CLASS); //为矩阵a,b赋值 mat_a(1,1)=a; mat_b(1,1)=b; //调用函数进行运算,第一个int类型的参数代表这个函数的输出参数的个数 add(1,mat_c,mat_a,mat_b); //创建一个c,用来取出计算出的c double *c = new double; mat_c.GetData(c, 1); //matlab调用结束,释放掉中间过程申请的内存 addTerminate(); cout<< c << endl; return 0; }
-
生成
C++ Shared Library
与生成C Shared Library
相比,C++ Shared Library调用过程更为友好,申请变量更简单,同时使用Terminate()
即可释放掉运行过程中临时申请的内存空间