matlab具有十分强大的数学处理能力,里面包含了很多的库,因此最近想在c++的基础上调用matlab处理一些数学式子,在看了很多的博客的基础上,也遇到了蛮多的问题,现在总结整理一下,以后当复习用。
先讲方法,后讲中间遇到的问题。
一、软件版本
matlabR2017b+vs2015,win10
二、具体步骤
关于matlab
1、matlab中写好函数m文件;
2、命令行输入(3条命令):mex -setup mbuild -setup mcc -W cpplib:Add -T link:lib Add.m
两次命令分别选择c++编译器即可,生成不同的文件,主要需要的是动态库文件(dll)、静态库文件(lib)和头文件(h),将这三个文件复制到下面创建的vs平台项目中去(头文件)
关于vs2015(记得转换成64位平台属性,即x64)
1、新建一个项目,点击“项目”->“项目属性”->“vc++目录”
选择“包含目录”,点击“编辑”,在最上面添加文件,将matlab文件添加进去,主要是三个文件,看个人的安装目录即可,分别为:\extern\include\win64和\extern\include,再加上自己通过编译的m文件所在的根目录(这个没试过是否可以删掉)
2、选择“库目录",这里主要是添加matlab库文件
分别为:\bin\win64和\extern\lib\win64\microsoft,我把通过编译的m文件所在的目录也加上了
3、点击”链接器“->”输入“
在”附加依赖项“中添加如下所需要的静态库文件:libeng.lib
libmat.lib
libmex.lib
libmx.lib
mclmcrrt.lib
mclmcr.lib
Add.lib(这里是自己通过m文件编译出来的,Add是自己设的文件名)
综上,属性栏基本设置完成
下面放入我自己用的测试代码(也是从别的博主那里参考的)
#include "stdafx.h"
#include <iostream>
#include <engine.h>
#include "Add.h"
using namespace std;
int main()
{
cout << 1 << endl;
//方式1,直接调用
if (!AddInitialize())
return -1;
int a = 10, b = 20;
int c;
mwArray mwA(1, 1, mxINT32_CLASS);
mwArray mwB(1, 1, mxINT32_CLASS);
mwArray mwC(1, 1, mxINT32_CLASS);
mwA.SetData(&a, 1);
mwB.SetData(&b, 1);
Add(1, mwC, mwA, mwB);
c = mwC.Get(1, 1);
cout << "c=" << c << endl;
AddTerminate();
//方式2,通过Engine调用
/*Engine *ep;
ep = engOpen(NULL);
engEvalString(ep, "x=0:0.05:2*pi;y=sin(x);plot(x,y,'.b')");
*/
cout << 1 << endl;
return 0;
}
代码解释:
(1)前面加上两个”cout<<1<<endl;"是因为刚开始的时候发现只有前面的1输出,后面的1不输出,中间被调用matlab的代码截断了;
(2)上面的方式1,是通过mwArray进行的,代码了matlab中最基本的矩阵操作,是一个类;这种方式需要注意了,必须“加头加尾”,即: if (!AddInitialize()) return -1;和 AddTerminate();这两个函数,“Add”表示了自己通过matlab编译的文件名。不然会出现截断,后面的“cout”边无法进行了。因为这里是同通过mwArray调用,则需要告诉编译器,调用从哪开始从哪结束,如果“无头无尾”,则会截断。
(3)Engine是通过调用matlab出来来处理的,比较麻烦一些,但是能通过绘图;
三、遇到的问题
1、最开始是用的matlabr2014a+vs2015,发现mex -setup都通不过,后面发现2014版本的matlab文件没有对应的2015的xml文件,因此在网上下了一个,添加进入,可以了
2、后面发现通过了mex -setup之后,mbuild -setup通不过,查了一下说的是破解不完全导致,就再破解了一次,不过没用原来的破解文件。
3、上面两个文件我都放在了资源里面,还没有通过审核,但是能找到下载的。但是注意了,是对应的matlabr2014a和vs2015。
4、后面都通过了,发现编译的时候一直提示“由于找不到*****dll,无法继续执行代码。重新安装程序可能会解决此问题”,网上有说直接把这个动态库文件添加到对应的exe目录下即可,如果所有添加,确实可以,但是matlab这个库有1个多G。。。。不现实。琢磨下来,明明都添加在工程属性里面了,怎么会没有。
后面在matlab里面找到了这个dll文件所在的目录(我的是在***\matlab2017b\bin\win64),并将目录添加到了系统的环境变量中去,即PATH,后面发现就可以了!!这个是最大的问题了。PATH在系统的高级系统设置里面就可以找到了
通过上面几个问题的解决,就解决了两种方式所出现的问题了。done
希望我的经验能对大家有所帮助!