最近在学习混合编程的相关知识,闲话不说,直接进入主题。
本系列实验基于MATLAB2010b 和VS2010 的平台,32位win7电脑。
调用MATLAB加法程序add.m,步骤如下。
(1)打开MATLAB2010b,出现如下界面。
(2)创建函数文件add.m,并编写程序如下。
注意:m文件存放的位置,程序中指定的MATLAB当前工作路径相匹配。
在本实验中MATLAB的默认当前工作路径为C:\Program Files\MATLAB\R2010b.
(3)打开VS2010软件,并建立一个空的控制台程序工程。如下图所示。
注意:工程项目中主文件可以是.c文件也可以是.cpp文件,如果是.c文件,则所有变量的声明,必须放在程序的最前面,否则会出现编译错误。
(4)设置C语言环境。
这里主要有三个地方需要设置。右键选择项目的属性,弹出窗口如下图所示。
a) 选中VC++目录,设置包含目录为:
C:\Program Files\MATLAB\R2010b\extern\include
b)选中VC++目录,设置库目录为:
C:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft
c)选中链接器菜单下的输入选项,添加附加依赖项。
libeng.lib、libmx.lib、libmat.lib、libmex.lib.
这四个库文件对应着我们使用的四类函数:MATLAB引擎相关函数、mxArray相关函数、mat文件相关函数、mex相关函数,对应的头文件为:engine.h、matrix.h、mat.h、mex.h
注意:设置编译环境库目录时,也可以在链接器常规下面的附加库目录里设置,只对本项目有效(经过验证,两者的效果是一样的,网上解释说:前者是针对所有的,后者只是针对C/C++编译器的,所以如果只用到了该编译器,则效果是相同的)。另外,需要增加windows系统的path环境变量:
C:\Program Files\MATLAB\R2010b\bin\win32,具体设置参见网上教程。设置之后,重启电脑,并在DOS命令框里输入ECHO %PATH%查看是否设置成功,结果如下图所示。
(5)编写主程序如下。
#include <stdio.h>
#include <stdlib.h>
/******加载MATLAB相关函数运行所需头文件********/
#include <engine.h>
#include <matrix.h>
#include <mat.h>
#include <mex.h>
//主程序入口
void main()
{
Engine *ep = engOpen(NULL); //打开精简版MATLAB
mxArray *a = mxCreateDoubleMatrix(1,1,mxREAL); //创建mxArray类型变量
mxArray *b = mxCreateDoubleMatrix(1,1,mxREAL);
double *aval = (double *)mxCalloc(1, sizeof(double)); //申请静态存储空间
double *bval = (double *)mxCalloc(1, sizeof(double));
aval[0] = 1;
bval[0] = 2;
mxFree(mxGetPr(a)); //使用mxSetPr函数前,必须先释放空间
mxSetPr(a, aval);
mxFree(mxGetPr(b));
mxSetPr(b, bval);
flag =engEvalString(ep, "cd ./work"); //向MATLAB发送字符串命令
//修改工作路径
engPutVariable(ep, "a", a); //将变量传入到MATLAB空间中
engPutVariable(ep, "b", b);
engEvalString(ep, "s=add(a,b);"); //求和
engEvalString(ep, "save test.mat;"); //保存所有变量
mxArray *s = engGetVariable(ep, "s"); //将MATLAB变量传回VS空间
printf("s=%f", *mxGetPr(s)); //打印结果
engClose(ep); //关闭精简版MATLAB
mxDestroyArray(a); //释放mxArray变量
mxDestroyArray(b);
system("PAUSE"); //屏幕暂留
}
(6)结果如下图所示。