您的位置:首页 > 编程语言 > MATLAB

matlab与vc混编1

2012-05-25 09:26 204 查看
以一个简单的例子来说明一下如果在VC中调用matlab中定义的.m文件. 与Matlab6.5稍有不同。

(一) 先建立matlab的m文件

这里为了简单起见,我在matlab中定义了一个求和函数, 其m文件如下:

function y = add_zh(a,b)

y=a+b

保存为myadd.m

(二) 对matlab编译环境进行设置

为操作系统添加环境变量:在环境变量(我的电脑->右键->高级)path中加入<MATLAB7_root>\bin\win32

打开matlab,在命令行状态下键入:mex -setup

然后出现如下提示:

--------------------------------------------------------------------------------------

Select a compiler:

[1] Intel C++ 9.1 (with Microsoft Visual C++ 2005 SP1 linker)

[2] Intel Visual Fortran 10.1 (with Microsoft Visual C++ 2005 SP1 linker)

[3] Intel Visual Fortran 9.1 (with Microsoft Visual C++ 2005 SP1 linker)

[4] Lcc-win32 C 2.4.1

[5] Microsoft Visual C++ 6.0

[6] Microsoft Visual C++ .NET 2003

[7] Microsoft Visual C++ 2005 SP1

[8] Microsoft Visual C++ 2008 Express

[9] Microsoft Visual C++ 2008 SP1

[10] Open WATCOM C++

[0] None

Compiler:

--------------------------------------------------------------------------------------

这里我们选择 '7’。(如果使用其他的编译器,可以相应的选择)

然后,继续在命令行状态下输入:

mbuild –setup

--------------------------------------------------------------------------------------

Please choose your compiler for building standalone MATLAB applications:

Would you like mbuild to locate installed compilers [y]/n? n

Select a compiler:

[1] Lcc-win32 C 2.4.1

[2] Microsoft Visual C++ 6.0

[3] Microsoft Visual C++ .NET 2003

[4] Microsoft Visual C++ 2005 SP1

[5] Microsoft Visual C++ 2008 Express

[6] Microsoft Visual C++ 2008 SP1

[0] None

--------------------------------------------------------------------------------------

这里需要几步确认。大家按情况操作即可。

(三) 对VC的编译器环境进行设置

在"工具->选项->项目和解决方案->VC++目录"里面设置include和lib的路径,分别添加一项,指向matlab安装目录中的
\extern\include 和 \extern\lib\win32\microsoft

(四) 这一步比较关键。在这一步中,将matlab中的.m文件转换为dll

在matlab命令行中输入:

mcc -W lib:addtest -T link:lib myadd.m

-W lib:addtest 表示生成DLL所需的addtest.h addtest.lib addtest.dll

-T link:lib 表示编译生成的目标(Target)文件类型为DLL

至此,可以发现在myadd.m所在的目录中产生了一大堆文件。我们只用其中3个:

addtest.h addtest.lib addtest.dll

(五) 新建一个VC工程

为了简单,我们在这里建立一个空的Win32控制台应用程序来进行演示。

然后,将上面这3个文件拷贝到VC工程所在的目录中,以便VC调用之,并将 addtest.h 加入到当前工程中。

(六) 进行VC编程

首先,在cpp文件中加入:

#include “addtest.h”

#include “mclmcrrt.h”

#include “mclmcr.h”

然后,设置VC的链接库。在"项目->属性->属性配置->链接器->输入->附加依赖项"中添加

addtest.lib mclmcr.lib mclmcrrt.lib libmx.lib libmat.lib libeng.lib

至此,VC的编译环境设置完毕。下面就是编程部分了。

(七) 编程部分的关键:接口和数据类型的转换

先给出VC实现的源代码:

------------------------------------------------------------------------

int main(void)

{

addtestInitialize(); //addtestInitialize是addtes.h中定义的函数的初始化函数

//为了调用matlab中的函数,必须使用数组数据类型,并其后调用matlab函数将其转化为矩阵格式(matlab的基本数据类型是矩阵)

static double x1[4]={1.0,2.0,100.5,200.1};

static double x2[4]={2.5,13.2,200.5,10.5};

double result[4];

//调用matlab创建3个矩阵,经过matlab编译完的dll 中的函数只能识别mxArray 类型的参数,所以我们在vc中定义的数值都需要转换成该种格式

mxArray *A=mxCreateDoubleMatrix(1,4,mxREAL); //创建一个1x4的矩阵A

memcpy(mxGetPr(A),&x1,4*sizeof(double)); //给矩阵赋值

mxArray *B=mxCreateDoubleMatrix(1,4,mxREAL);

memcpy(mxGetPr(B),&x2,4*sizeof(double));

mxArray *C=mxCreateDoubleMatrix(1,4,mxREAL);

mlfMyadd(1,&C,A,B); //调用m文件函数(注意:函数名myadd首字母必须大写)

memcpy(&result,mxGetPr(C),4*sizeof(double));

cout<<result[0]<<" "<<result[1]<<" "<<result[2]<<" "<<result[3]<<endl;

//释放矩阵

mxDestroyArray(A);

mxDestroyArray(B);

mxDestroyArray(C);

addtestTerminate();//中止调用

return 0;

}

------------------------------------------------------------------------

相信看到里面的注释,我们就明白的差不多了。

VC编程以实现对matlab函数的调用,例如VC中我们实现两个double型的相加,则需要做上述的编程:首先定义两个数组并存入我们要进行函数操作的数据(也就是所谓的实参);然后将这两个数组转换为matlab可以识别的矩阵;然后调用m文件中自定义的函数,对矩阵进行操作;最后将结果再转回VC支持的数据格式:

至此,经matlab函数处理过的数据已经存入了VC中的result变量。

大家可以看出来,在进行调用的时候,我们使用的是m文件的文件名myadd,而不是m文件中定义的函数名add_zh(a,b)。

* mex -setup中间有个空格。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: