C/C++和MATLAB之间的混合编程可以是:C/C++编程的过程中调用MATLAB,也可以使MATLAB编程过程中调用C/C++程序。前段时间了解了一下在C/C++程序中调用MATLAB的方法。这其中又分为两类:通过DLL方式调用MATLAB程序、通过MATLAB引擎调用MATLAB进行运算,其中仅仅是按照学长要求触及了一下通过MATLAB生成DLL为C提供运算支持的方法。
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
设置Visual Studio项目属性(以Vs2017为例)
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()
即可释放掉运行过程中临时申请的内存空间