搞了一天终于成功了,
Matlab 和 C++ 混编
主要有两种方式
一 matlib调用 C++
貌似有 利用MEX技术和调用C/C++动态连接库。
二 VS 调用 matlab (三种)
1、调用matlab引擎
Matlab的引擎库为用户提供了一些接口函数,利用这些接口函数,用户在自己的程序中以计算引擎方式调用Matlab文件。该方法采用客户机/服务器的方式,利用Matlab引擎将Matlab和C/C++联系起来。在实际应用中,C/C++程序为客户机,Matlab作为本地服务器。C/C++程序向Matlab计算引擎传递命令和数据信息,并从Matlab计算引擎接收数据信息。
特点:
利用计算引擎调用Matlab的特点是:节省大量的系统资源,应用程序整体性能较好,但不能脱离Matlab的环境运行,且运行速度较慢,但在一些特别的应用[9](例如需要进行三维图形显示)时可考虑使用
2、利用mcc编译器生成的cpp和hpp文件
Matlab自带的C++Complier--mcc,能将m文件转换为C/C++代码。因此,它为C/C++程序调用m文件提供了另一种便捷的方法。
3、利用mcc编译器生成的DLL文件(主要讲这个)
Matlab的C++ Complier不仅能够将Matlab的m文件转换为C/C++的源代码,还能产生完全脱离Matlab运行环境的独立可执行DLL程序。从而可以在C/C++程序中,通过调用DLL实现对 Matlab代码的调用
Matlab R2014 安装
先贴出来下载地址:
链接: http://pan.baidu.com/s/1eRurHM6 密码: 8t4i
博客:http://jingyan.baidu.com/article/c275f6ba218d43e33d7567fd.html(我是按照他的步骤走的,直到安装完,这样并没有完全破解,生成dll时还是有问题,搜索后下载这个,继续替换掉就可以生成dll了
Matlab R2014 已经相当不错了 输入命令就可以直接设置了
贴下Matlab测试程序:add.m
function [a,b]=add(x,y)
a=2*x+y;
b=3*y;
end
输入命令:mcc -W cpplib:add -T link:lib add.m -C
其中 add.m 就是上面的测试程序 cpplib:add 这个add自己可以随意修改,之后会生成add.lib,add.h,add.dll。
Visual studio 2013 (为了减少错误,默认安装)
链接: http://pan.baidu.com/s/1i4ogWCX 密码: sast
配置系统环境变量:
用户变量:PATH
C:\Program Files\MATLAB\R2014a\bin\win64
系统变量:Path
C:\Program Files\MATLAB\R2014a\bin\win64
配置完系统变量要从新启动电脑才能生效。
新建项目 win32控制台应用程序。
把add.lib,add.h,add.dll 放到程序目录下:
E:\Code\Matlab_test3\Matlab_test3 Matlab_test3进去之后还会有个Matlab_test3,放到后面的里面。
调试模式是 debug X64(一定配置X64)
配置:VC++目录
包含目录:C:\Program Files \MATLAB\R2014a\extern\include
库目录:C:\Program Files \MATLAB\R2014a\extern\lib\win64\microsoft
配置:链接器->输入选项中,附加依赖项
add.lib
libmat.lib
libmex.lib
mclmcr.lib
mclmcrrt.lib
把 add.h文件添加到 头文件中
add.dll,add.lib文件添加到资源文件中
代码:
// Matlab_test3.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include"add.h"
using namespace std;
#pragma comment(lib,"add.lib")
int _tmain(int argc, _TCHAR* argv[])
{
if (!addInitialize()) //初始化,在libmysvd.h中
{
cout << "Could not initialize libmysvd!" << endl;
exit(0);
}
mwArray a(1, 1, mxDOUBLE_CLASS);
mwArray b(1, 1, mxDOUBLE_CLASS);
a(1, 1) = 20;
b(1, 1) = 30;
mwArray x(1, 1, mxDOUBLE_CLASS);
mwArray y(1, 1, mxDOUBLE_CLASS);
add(2, x, y, a, b);
double *i = new double;
double *j = new double;
x.GetData(i, 1);
y.GetData(j, 1);
std::cout << "x=" << *i << " y=" << *j << std::endl;
system("pause");
return 0;
}