特此说明:亲测有效@_卡拉不是考拉Kala
对于VC++与matlab的混合编程方法有多种,如调用matlab引擎、调用matlab的C/C++数学库和图像库或者是将编写好的matlab的.m文件编译成动态库.dll再进行调用。同样也可以反过来,利用matlab调用C/C++库等等。
看了网上有很多教程,根据教程一步步操作。结果发现都报错有问题,于是自己进行尝试,并进行测试并记录如下:
首先对于各个平台环境的选择如下:Win7 x64操作系统、matlab2010b x64、VS2010。根据网上教程VS2008和matlab2010b测试结果:error LNK2019: 无法解析的外部符号…,能力有限尝试各种方法实在解决不了这个问题,于是乎换了上述的平台环境不存在这个问题,就暂且认为是兼容性引起的问题。
实现步骤如下:
1、新建一个命名为Call_engine 的win32控制台程序;
2、配置环境:项目àCall_engine属性àVC++目录à包含目录中将matlab安装目录下的(我这里的安装目录为D:\ProgramFiles):D:\ProgramFiles\MATLAB\R2010b\extern\include添加进来,如图1所示;
图1
(添加包含目录)
3、配置环境:项目àCall_engine属性àVC++目录à库目录中将matlab安装目录下的:
D:\ProgramFiles\MATLAB\R2010b\extern\lib\win64\microsoft添加到库目录中,入图2所示;
图2
(添加库目录)
4、载入必要的.lib: 在项目àCall_engine属性à连接器à输入
à附加依赖项中添加libeng.lib、libmx.lib、libmat.lib(注意利用回车换行或者空格隔开)如图3所示;
图3
(添加附加依赖项)
5、在配置管理器中更改解决方案平台:在配置管理器中平台列,如果是win32平台,则点击下拉菜单:选择新建à新建平台àx64,如图4所示;
图4
(更改解决方案平台)
至此,环境配置完毕,开始写码测试。
测试代码如下(调用matlab的eig函数计算矩阵的特征值):
注:先包含头文件engine.h
#include "stdafx.h"
#include "engine.h"
#include <stdio.h>
#define BUFSIZE 128
int _tmain(intargc, _TCHAR*argv[])
{
Engine*ep;
mxArray*T=NULL;
char buffer[BUFSIZE];
double a[][3]={1,2,3,1,2,3,1,2,3};
if (!(ep =engOpen("\0")))
{
fprintf(stderr,"\nCan'tstart MATLAB engine\n");
return EXIT_FAILURE;
}
T = mxCreateDoubleMatrix(3, 3, mxREAL);
memcpy((void *)mxGetPr(T), (void *)a,sizeof(double)*(sizeof(T)+1));
engOutputBuffer(ep,buffer, BUFSIZE);
engPutVariable(ep,"T",T);
engEvalString(ep,"T'");
printf("%s",buffer);
engEvalString(ep," X =eig(T')");
printf("%s",buffer);
return 0;
}
测试结果:
这里的代码就不作注释了,贴个matlab提供的各个API详解地址:
http://www.cnblogs.com/nktblog/archive/2012/04/07/2435686.html;