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

来源:互联网 发布:杜月笙 知乎 编辑:程序博客网 时间:2024/05/21 14:25

转载地址: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();

}

0 0
原创粉丝点击