弄了大半天,终于搞定了VS210与matlab混编的配置问题,俗话说:磨刀不误砍柴工。如果配置出了问题,则多么好的程序也无济于事,因为无法编译运行啊!当然有些方案是在网站上搜到的啦:
matlab 版本:matlab7.1 环境: VS2010
配置:
1. 菜单:Project → Properties...
选择Configuration Properties下的 VC++ Directories。
在 Include
Directories栏目中添加matlab相关的include文件。例如..\MATLAB\R2010b\extern\include和..\MATLAB\R2010b\extern\include\win32
在 Library Directories栏目中添加matlab相关的lib文件。例如:C\program\MATLAB\R2010b\extern\lib\win32\microsoft。(为了保险,我把这个lib文件也加进去了:...\MATLAB\R2010b\lib\win32)
2. 菜单:Project → Properties...
选择Configuration Properties下的 Linker → Input。
在 AdditionalDependencies栏目中输入项目需要引用matlab的的lib文件库。例如:libeng.lib
libmx.liblibmex.lib等(其实这几个是可以自动加进去的)。如果要对所有的配置添加lib库文件,可先将左上角的Configuration
中的 Active(Debug) 设置为 Allconfigurations
3.菜单:Project → Properties... 选择
ConfigurationProperties下的 Linker → General。在 Additional include
Directories栏目中,添加库所在的目录名称。如:C:\Program
Files\MATLAB71\bin\win32这一步相当的重要,不然的话,各种dll文件找不到,lib文件找不到之类的报错,头都大死了。
现在就可以混编程序了~再也不用编译时出现好多 undefined 和xxx之类的错误哦~
如果在编译时出现 不能打开XX.lib之类的错误,肯定是配置出了问题
下面的程序以供参考:
#include
#include
using namespace std;
#include
#include
void main()
{
// 定义循环变量
int i = 0, j = 0;
//
状态变量
int nStatus
= 0;
// 定义MATLAB引擎指针
Engine *ep;
// 定义mxArray变量指针
mxArray *A, *B;
// 定义矩阵数组
//
注意:VC中矩阵的行列次序与MATLAB正好时相反,需要转置。
double arData[3][3] =
{{7.5,16.3,9.6},{13.2,8.9,12.3},{9.6,5.4,13.7}};
double arResData[3][3];
// 输出原矩阵
cout<
for(i = 0; i < 3; i++)
{
for(j = 0; j <
3; j++)
{
cout<
";
}
cout<
}
// 打开MATLAB引擎
ep = engOpen(NULL);
if(ep == NULL)
{
cout<
exit(EXIT_FAILURE);
}
//
是否显示MATLAB窗口:true-显示;false-隐藏。
nStatus =
engSetVisible(ep, false);
if(nStatus
!= 0)
{
cout<
exit(EXIT_FAILURE);
}
// 为mxArray变量分配空间
A = mxCreateDoubleMatrix(3,3,mxREAL);
B = mxCreateDoubleMatrix(3,3,mxREAL);
if(A == NULL || B == NULL)
{
cout<
exit(EXIT_FAILURE);
}
//
将数组中的数据写入到mxArray空间中
memcpy((void*)mxGetPr(A),(void*)arData,sizeof(arData)); //
将矩阵变量A写入到MATLAB引擎空间
nStatus =
engPutVariable(ep,"A",A);
if(nStatus
!= 0)
{
cout<
exit(EXIT_FAILURE);
}
//
执行引擎命令求矩阵A的逆矩阵
nStatus =
engEvalString(ep,"B=inv(A)");
if(nStatus
!= 0)
{
cout<
exit(EXIT_FAILURE);
}
//
从MATLAB引擎空间中读取执行结果
B =
engGetVariable(ep,"B");
//
将矩阵变量B复制到数组arResData中
memcpy((void*)arResData,(void*)mxGetPr(B),sizeof(arResData));
//
释放矩阵变量空间
mxDestroyArray(A);
mxDestroyArray(B);
//
关闭MATLAB引擎
engClose(ep);
//
输出计算结果
cout<
for(i = 0; i
< 3; i++)
{
for(j = 0; j < 3; j++)
{
cout<
";
}
cout<
}
//
暂停程序,查看结果
system("pause");
}
经过本人运行时完全可以的!下面为运行结果: