基于MATLAB编译器的VC与MATLAB混合编程

时间:2022-10-05 05:36:02

【前言】基于MATLAB编译器的VC与MATLAB混合编程由文秘帮小编整理而成,但愿对你的学习工作带来帮助。(School of Computer Science and Technology, Southwest China University of Technology, Mianyang 621000, China) Abstract: How to use Matlab Compiler for VC and Matlab joint programming is described in this article. Using Matlab compiler to implement ...

基于MATLAB编译器的VC与MATLAB混合编程

摘要:该文介绍了如何利用Matlab7.0的编译器实现VC与Matlab联合编程。并给出具体实例,利用Matlab编译器在VC中实现层次聚类分析。

关键词:VC;Matlab;Matlab编译器;层次聚类分析

中图分类号:TP311文献标识码:A文章编号:1009-3044(2009)33-9599-02

Based on MATLAB and the MATLAB Compiler VC Hybrid Programming

JIANG Yao, LIU Zi-wei, LIU Chun-ju

(School of Computer Science and Technology, Southwest China University of Technology, Mianyang 621000, China)

Abstract: How to use Matlab Compiler for VC and Matlab joint programming is described in this article. Using Matlab compiler to implement hierarchical clustering analysis in VC as a detailed example is introducted.

Key words:VC; Matlab; Matlab compiler; hierarchical cluster analysis

Matlab是一种应用领域广泛的工具软件。但是,它强大的功能只能在其提供的平台下使用,很难直接应用于软件开发,这大大限制了Matlab的应用。而VC++由于其丰富得人机界面,高效的执行效率已经成为基于Windows平台下开发商业软件的必备工具。matlab编译器的出现可以使vc++与matlab 完美的结合,发挥各自的优势。

1 Matlab编译器的使用

1.1 Matlab Compiler(Matlab编译器)

Matlab Compiler是Matlab自带的一个编译器,它能将M文件转化成C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。由于M文件可以用编译器转化成为C 或C++源代码, 所以该种方式的调用能脱离Matlab平台,甚至可以在没有安装Matlab 的机器上运行。但是Matlab 编译器只能编译函数M文件,不能编译脚本M文件。但是我们通过简单的修改,就可以把脚本M文件转变成为函数M文件。这种方法简单又可靠。

1.2 在VC中使用Matlab Compiler

安装matlab的同时也安装了Matlab Compiler,但要实现其功能,还要进行Matlab 编译器和VC++6.0 集成开发环境的设置。启动matalb7.0,在命令窗口中输入mex-setup回车按照提示,根据实际情况进行设置,该文选择的是VC++6.0。然后就可以用Matlab 编译器来处理需要调用的函数M文件,在你要处理的M文件所在目录输入:

mcc-W cpplib: dllname-T link:lib filename.m

其中dllname 为生成的dll文件的名称,自己可以按照习惯定义,filename.m为要编译的M文件名回车,那么会在当前目录下生成一系列的文件,其中 dllname.dll(动态链接库文件),dllname.ctf(CTF文件),dllname.h(C++头文件),dllname.lib(引入库文件)是我们必须的。其余文件是、dllname.cpp(C++源文件)和mccExcludedFiles.log(日志文件)等。

同时,在VC++6.0中也要进行相应的设置,添加include 与Library目录。新建一个工程,VC菜单Tools―>Options―>Directories―>Show directories for: Include files 添加:

\Extern\Include

Tools―>Options―>Directories―>Show directories for: Library 添加:

\Extern\Lib\Win32\Microsoft\msvc60.

2 基于Matlab编译器的VC与Matlab混合编程实现层次聚类分析

2.1 创造M源文件

新建M文件,文件名为cluster,在文件中输入如下:

function m=cluster(x)%函数名

m=pdist(x);%默认使用最小距离作为对象间距离

squareform(m);%将各对象间的距离组成距离矩阵

n=linkage(m);%对象距离排列

dendrogram(n);%可视化聚类结果

2.2 使用Matlab编译器生成动态链接库

在Matlab Command Window 输入如下命令:

mcc-W cpplib:libcluster-T link:lib cluster.m

在当前文件夹中会出现以下文件:libcluster.dll,libcluster.lib,libcluster.ctf,libcluster.h,libcluster.cpp,mccExcludedFiles.log以及其他自动生成的文件。

2.3 在VC中调用动态链接库

在VC中创建一个对话框工程,名称为Test。设计一个简单的对话框如图1。

将Matlab编译器生成的libcluster.dll,libcluster.lib,libcluster.ctf,libcluster.h复制到工程目录中。将头文件加入到工程中,并在对话框主cpp文件中写入#include "libcluster.h"。

在构造函数中调用初始化函数mclInitializeApplication(NULL,0)(该函数的作用是设置了一个全局的MCR 状态, 并且构建MCR 实例),libclusterInitialize()(初始化动态链接库)。代码如下:

if(!mclInitializeApplication(NULL,0))//初始化应用

{MessageBox("Could not initialize the application.\n");

exit(1);}

if (!libclusterInitialize())//初始化库

{MessageBox("Could not initialize the library.\n");

exit(1);}

在按钮“聚类测试”的响应函数中添加如下代码:

void CTestDlg::OnTEST()

{mwArray X(5,2,mxDOUBLE_CLASS);//创建5行2列的Matlab矩阵对象

mwArray Y(5,5,mxDOUBLE_CLASS);

double x[] = {1,2,3,4,5,6,7,8,8,0};//创建测试数组

double m[25] = {0};

X.SetData(x,10);// 给输入 mwArray 对象赋值

cluster(1,Y,X);//执行聚类函数,第一个参数是输出参数的个数

Y.GetData(m,25);//取出结果

libclusterTerminate();//释放链接库

mclTerminateApplication();//释放应用资源}

程序运行结果如下。

由于GetData()函数是以列为单位对矩阵进行赋值,所以上述结果为(1,6),(2,7),(3,8),(4,8),(5,0)5个对象进行的层次聚类的结果。

3 总结

通过以上方式,很好的实现了VC与Matlab的联合编程,避免了使用大量复杂代码才能在VC中实现层次聚类,使得两个软件可以同时发挥各自优点,更大地方便了我们的软件开发。

参考文献:

[1] Han Jiawei,Kamber M.Data Mining Concepts and Techniques[M].Beijing:China Machine Press,2007:30-65.

[2] 陈永超,李汉强.MATLAB7.0与VC6.0的接口技术[J].电脑知识与技术,2006(2):66-67.

[3] 飞思科技产品研发中心.Matlab7基础与提高[M].北京:电子工业出版社,2005.

上一篇:基于XACML的安全建模和软件UML建模集成 下一篇:Crystal Report在VB报表设计中的应用技巧