使用的环境是vs2008+matlab2011,其它的版本应该差不多。
使用matlab写好一个函数后,在c++中调用它,可以极大的提高开发速度。
由于别的文章没有介绍如何输入输出,我在这里再写一遍。
1.配置:
文章http://blog.163.com/rongting_chen/blog/static/164906844201252354518462/中,已经详细介绍了如何配置matlab,不再赘述。
2.编译:
上面的文章使用命令编译,编译出的是c文件,如果你需要c++的版本,可以使用
http://stackoverflow.com/questions/6429243/how-to-call-matlab-functions-from-c
中介绍的图形界面编译工具。(File-> new -> Deployment Project and then choose C++ shared Library)
编译好了只好,在你使用图形编译工具新建的工程目录中,distrib文件夹下应该有*.h, *.lib, *.dll文件。
3.使用
例如我写了matlab函数
function [ c ] = sum22( a,b )
c = a + b;
end
用来求解矩阵的和,编译之后产生sum22.h,sum22.lib,sum22.dll三个文件,把sum22.h文件放到你的工程的源文件夹下,把sum22.lib,sum22.dll放到你的项目目录下。
在c++代码中加入:
#include "sum22.h"
#pragma comment( lib, "libeng.lib" )
#pragma comment( lib, "libmx.lib" )
#pragma comment( lib, "libmat.lib" )
#pragma comment( lib, "mclmcrrt.lib" )
#pragma comment( lib, "mclcommain.lib" )
#pragma comment( lib, "sum22.lib" )
使用的方法:
mclInitializeApplication(NULL,0);
sum22Initialize();
double numbrIn1[] = {1,2,3,4};//输入变量1,为2*2矩阵,所以长度为4
double numbrIn2[] = {5,6,7,8};
double numbrOut[4];//输出变量
mwArray array_in1(2, 2, mxDOUBLE_CLASS, mxREAL);//建立 2 * 2 浮点矩阵
mwArray array_in2(2, 2, mxDOUBLE_CLASS, mxREAL);
array_in1.SetData(numbrIn1,4);
array_in2.SetData(numbrIn2,4);
mwArray array_out;
sum22(1, array_out, array_in1, array_in2);//1代表一个输出(不是很确定),然后是输出参数,然后是两个输入参数
array_out.GetData(numbrOut, 4);
//这时候就可以看到numbrOut的值发生了变化
mclTerminateApplication();
sum22Terminate();
在对QT、c++的混合编程时,发现wincon.h报出一堆编译错误,主要是语法错误,我把include 的文件等等放到最开头,问题解决。
mclInitializeApplication这样的函数要放到构造和析构函数中,程序只能调用一次,而不是每次都调用,否则会运行时错误。
备注:
这篇文章参考了
http://stackoverflow.com/questions/6429243/how-to-call-matlab-functions-from-c
http://blog.163.com/rongting_chen/blog/static/164906844201252354518462/
的内容。