C++与Matlab编程的相互调用方法

系统配置:

环境变量path中要加入matlab的bin目录:即加上X:/XXXXXX/MATLAB/R2009a/bin/win32

C++编译器配置:

不管用VS也好,还是VC6.0也好,VC6中是打开Tool→Options→Directories,VS中是打开Tool→Options→Project and Solution→VC++ Directories,然后添加以下东西:

  1. Include Files里面添加X:/XXXXXX/MATLAB/R2009a/extern/include
  2. Include Files里面添加X:/XXXXXX/MATLAB/R2009a/extern/include/win32
  3. Library Files里面添加X:/XXXXXX/MATLAB/R2009a/extern/lib/win32/microsoft

这样C++端就完成配置了。

Matlab的配置:

  1. 命令行中输入mbuild -setup,第一个选y,第二个选你的编译器,VS或者VC6.0对应的号码,一般是2,第三个再选y
  2. 命令行中输入mex -setup,选项和第一步一样。

配置完上面的东西,就可以了~

C++调用matlab使用方法:

  1. 首先写一个正确的matlab的m文件并保存,【额,不正确的我没试过。。】比如说是functin [a b] = function_name(c,d)
  2. matlab命令行中输入deploytool
  3. 在Deployment Tool左上角点击Create a new deployment project
  4. 选择Matlab Compiler中的C++ Share Library
  5. 并在下面输入你的Project名字和路径
  6. 右键Add files加入你之前写的m文件
  7. 点击Build the Project即可完成编译。
  8. 在你选择的Project的路径下有两个文件夹,distrib和src,src那个不用管,打开distrib
  9. 里面有三个文件是你要用的,.dll和.lib和.h文件
  10. 建立你的C++工程,并将上一步中的三个文件加入到你的C++工程中即可。

C++代码编写:

文件一开始要添加lib文件,代码如下:

#pragma comment(lib,"libdflapack.lib")  #这个文件在2010a里面找不到,要去掉#pragma comment(lib,"libemlrt.lib")#pragma comment(lib,"libeng.lib")#pragma comment(lib,"libfixedpoint.lib")#pragma comment(lib,"libmat.lib")#pragma comment(lib,"libmex.lib")#pragma comment(lib,"libmwlapack.lib")#pragma comment(lib,"libmwservices.lib")#pragma comment(lib,"libmx.lib")#pragma comment(lib,"libut.lib")#pragma comment(lib,"mclcommain.lib")#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"mclmcrrt.lib")1.2.3.4.5.6.7.8.9.10.11.12.13.

注意一下倒数第三个,据说matlab后面的版本是mclcommain.lib,之前的版本是mclco.lib,没考证,出了问题你去之前添加的lib路径下看一下就知道了。

然后添加你自己刚刚生成的lib文件

#pragma comment(lib,"XXX.lib")1.

之后必然要包含你自己的头文件啦。。

#include "XXX.h"1.

至于怎么用那些函数,简单说明一下,首先声明一下,下文中提到的XXX都是你在上面第五步中写的工程名,也就是上面lib和.h的XXX一样。

调用之前要先初始化,即调用函数:

XXXInitialize();1.

经过试验,上面那个函数的运行之间极其之长。。。

当然,在结束调用,或者在程序的尾部要调用:

XXXTerminate();1.

调用函数呢,就是你m文件的函数名,对了,众所周知m文件的文件名要和m文件里面的函数名一样,但是m文件的函数名不一定要和这里设置的Project一样,比如说函数名叫myfunction(),而工程名叫test,那么你生成的就是test.h,test.dll,test.lib,但是你在C++代码里面调用的时候用的却是myfunction。

如果你的myfunction没有输入输出参数,那么调用的时候就直接写myfunction()就可以了,如果有输入输出参数,函数调用格式是:

myfunction(int nargout, mwArray& matrix...,const mwArray& n1....);1.

直接理解就是输出参数个数nargout

然后nargout个输出参数,数据类型是mwArray,稍有常识的人只要看到函数调用里面有&就基本是输出参数啦~

然后就是各个输入参数,数据类型也是mwArray,看到const就知道应该是输入参数啦~

啥?你问我为什么不用写输入参数个数,好好复习matlab函数去!!!

关于mwArray:

这个是matlab生成的dll的接口数据类型,这个看上面的函数调用你就应该清楚这一点了,定义在matlab安装目录下的extern/include/下的mclcppclass.h下,有兴趣的自己看去~

虽然还有一种数据类型是mxArray,但是不推荐使用,而且mwArray本身就是对mxArray的封装!不推荐使用是因为它的内存管理方式不好,而且使用的时候要用指针,而mwArray你可以直接作为对象来操作。【如果要生成接口为mxArray的dll的话,也可以在matlab命令行里面使用申明,但都说了。。不推荐。。】

matlab里面不特别说明数据类型都是double,但是在这里定义一个mwArray数据的时候要说明类型,定义方法如下:

mwArray matrix(2,2,mxDOUBLE_CLASS);mwArray matri2(1,m,mxINT8_CLASS);1.2.

如果要赋值或者读取,方法如下:

mwArray matrix(1,4,mxDOUBLE_CLASS);double a[] = {1,2,3,4};matrix.SetData(a,4);cout<<matrix(1,2)<<endl;double *b = new double[4];matrix.GetData(b,4);cout<<b[0];1.2.3.4.5.6.7.8.9.


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空