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

VC调用matlab中定义的.m文件中的函数的实例

2015-04-21 17:23 489 查看
转载地址:http://someday131.blog.sohu.com/70399409.html

VC调用matlab R2006版中定义的.m文件中的函数的实例

此版本与6.0版不大一样,与7.0版的设置类似。(经过测试)

Matlab是一个强大的数学计算/仿真工具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数。但在很多情况下,我们不得不使用VC编程。那么,如何在VC中利用matlab的资源呢?在这里我简要的以一个简单的例子来说明一下如果在VC中调用matlab中定义的.m文件。繁多的理论就不说了,简明扼要的说一个实例。相信大家看过之后都会马上学会的,其中黄色底显示的部分是需要我们手工输入的部分。

步骤如下:

一是先建立 matlab 的 m 文件。

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

function y = myadd(a,b)

y=a+b

保存为myfunct.m

二下面来对 matlab 编译环境进行设置。 打开matlab,在命令行状态下键入:mex-setup

然后出现如下提示:

Select a compiler:

[1] Borland C++Builder version 5.0 in C:\Program Files\Borland

[2] Lcc C version 2.4 in F:\SOFT\SHARE\MATLAB65\sys\lcc

[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

Compiler:

这里我们选择’3’。(如果使用其他的编译器比如BCB,那么就可以相应的选择’1’)

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

mbuild –setup

Please choose your compiler for building standalone MATLAB applications:

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

Select a compiler:

[1] Borland C++Builder version 5.0 in C:\Program Files\Borland

[2] Lcc C version 2.4 in F:\SOFT\SHARE\MATLAB65\sys\lcc

[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

Compiler:

这里需要几步确认。大家按情况操作即可。以上操作在第一次使用时需进行,以后可省去。

三对 VC 的编译器环境进行设置。 在Tools-options-directory里面设置include和lib的路径,分别添加一项,指向matlab安装目录中的\extern\include和 \extern\lib

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

在matlab命令行中输入:

mcc -B csharedlib:mysharedlib myadd.m

(mysharedlib是生成的lib文件名,可以随意命名。myadd.m是想调用的.m文件名。

至此,可以发现在myadd.m所在的目录生成了一系列文件。我们将要使用:mysharedlib.h,mysharedlib.dll,mysharedlib.lib,mysharedlib.ctf。

五新建一个 VC 工程 。这里取名为 mat 。为了简单,我们在这里建立一个对话框来进行演示。如下:

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

六进行 VC 编程。

首先,在cpp文件中加入: #include “mysharedlib.h”

然后,设置VC的链接库。在project-settings-link下的object/library modules中加入:

libmx.lib libmat.lib libeng.lib

设置环境:Project- >Setting- >Link- >Category :Input- >Object/library modules:mclmcr.lib mysharedlib.lib;

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

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

先给出 VC 实现的源代码:

void CMatDlg::OnButton1()

{ // 在 matlab 中定义的 m 文件 :myadd ,其功能是完成两个数的相加操作。

if( !mclInitializeApplication(NULL,0) )

{

AfxMessageBox(“Could not initialize the application.\n”);

}

if(!mysharedlibInitialize())

{

AfxMessageBox(“Can’t Initalize!”);

}

mxArray *in1,*in2;

mxArray *out1=NULL;

double y1;

double x1=32,x2=24;

in1=mxCreateDoubleMatrix(1,1,mxREAL);

in2=mxCreateDoubleMatrix(1,1,mxREAL);

memcpy(mxGetPr(in1),&x1,sizeof(double));

memcpy(mxGetPr(in2),&x2,sizeof(double));

mlfMyadd(1,&out1,in1,in2);

double *p=mxGetPr(out1);// 将 matlab 中的矩阵的指针传递给 C 语言中的指向 double 的指针

y1=p[0];

CString str;

str.Format(“Y=%f”,y1);

AfxMessageBox(str);

// 释放这些矩阵

mxDestroyArray(in1);in1=0;

mxDestroyArray(in2); in2=0 ;

mxDestroyArray(out1); out1=0;

mysharedlibTerminate();

mclTerminateApplication();

}

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