admin 管理员组

文章数量: 1086019


2024年3月28日发(作者:哈夫曼编码表)

维普资讯

第25卷第1期 

2008年1月 

计算机应用与软件 

Computer Applications and Software 

Vo1.25 No.1 

Jan.2008 

运用设计模式实现Matlab与.NET交互编程 

袁 泉 石昭祥 

(解放军电子工程学院安徽合肥230037) 

摘 要 由于Matlab和.NET应用程序的异构性,在.NET中无法直接调用Matlab的计算功能。通过在问题域中运用设计模式, 

设计了一组可重用的类实现Matlab与.NET交互编程。使用这组类,可以降低.NET应用程序和Matlab计算引擎之间的耦合度,简 

化调用过程,用户可以在开发应用程序中像使用按钮控件一样方便地使用Matlab提供的强大科学计算能力。 

关键词 设计模式.NET Matlab 

APPLICATIoN oF DESIGN PATTERNS To IMPLEMENTATIoN oF INTERACTⅣE 

PRoGRAMMING FoR MATLAB AND.NET 

Yuan Quan Shi Zhaoxiang 

(Electronic Engineering Institute ofPLA,Hefei 230037,Anhui,China) 

Abstract 

Computation function of Matlab cannot be directly used in.NET application program because of the isomer between Matlab and 

NET.A set of reusable classes is designed based on design patterns for interactive programming between Matlb and.NET.Couplaing between 

NET application program and Matlab is receded by the set of classes.The transfer process is simpliifed.Users Can use the controls like button 

control to call the scientiifc computation function of Matlb when tahey develop application software. 

Keywords Desin Pattgerns.NET Matlab 

统中的其它模式提供应用背景来与它们相关联。在设计过程 

0 引 言 

Matlb是高性能的科学计算软件,在软件开发过程中经常 a

将Matlb和专业的Wiandows应用程序开发工具结合使用。微 

软新推出的开发工具VisualStudio.NET成为开发Windows平台 

中应该首先理解需求牵涉到的问题领域,将注意力集中到问题 

领域中的实体间的高层关系,找出可能用到的模式,根据这些模 

式考虑系统中实体间的关系,为要解决的问题勾画一个大的框 

架。接着在框架中使用其它的相关模式,并在使用模式的过程 

中对设计进行进一步的细化。最后是系统的具体实现。 

应用程序的一次革命,在.NET中程序被编译成通用中间语言 

(CIL),然后在.NET提供的虚拟机上运行,这提供了更好的安全 

性,而且使得程序开发在各种语言之间的移植十分容易。而 

Matlb是原生的Wiandows程序,提供的API在.NET属于非托管 

函数,不能直接在.NET的虚拟机中运行。因此.NET和Matlb a

软件的异构性使得它们之间的交互编程具有一定的困难,本文 

通过运用设计模式对问题进行分析,通过一组可重用的类实现 

了Matlb计算功能在.NET中的调用。a 

1.1 应用程序调用Matlab的方法 

在应用程序中调用Matlab有三种方法,直接使用Matlb引 a

擎提供的C语言API;通过Matlb的COM自动化服务器;应用 a

程序借助DDE会话和Matlb通信。这三种方法中直接调用 a

Matlb引擎提供的C语言API的方法执行效率最高,a但是这种 

方法使用比较复杂,如果每次编写应用程序都要考虑如何调用 

的细节,不仅不利于开发人员将精力集中到特定的应用上去,而 

且在应用程序中加入的大量和Matlb操作紧密相关的代码,a也 

会降低程序的可扩展性和可维护性。因此我们运用设计模式对 

问题域进行分析,通过设计一组可重用的类来简化Matlb在 a

1设计模式 

模式的创始人Christopher Alexander给出了模式的定义: 

“模式是表达应用环境、问题和解决方案之间关系的三元组,是 

NET中的调用。 

1.2运用模式进行设计 

设计模式中的一条基本原则就是,优先使用对象的组合而 

不是继承,这样设计出来的对象粒度较小,容易复用和适应未来 

的变化。在.NET中调用Matlb的计算功能,主要涉及到三个 a

方面:对Matlb计算引擎的调用;Matalab中的矩阵数据类型和 

在某种环境下如何解决某种问题的指导。”。模式存在于所有 

的阶段(分析、设计以及实现)之中,它描述了问题域中实体间 

的明确关系。文献[1]总结了23种设计模式,并按其目的分为 

创建型、结构型、行为型三类。模式描述了问题域中实体间的明 

确关系,为我们在设计阶段考虑系统中各实体间的关系提供了 

方法。在实际应用中,各种模式经常不是单独使用,而是被结合 

在一起共同解决一个问题的,系统中的一个模式经常通过为系 

收稿日期:2005—12—12。袁泉,博士生,主研领域:系统仿真,软件 

工程应用。 

维普资讯

第l期 袁泉等:运用设计模式实现Matlab与.NET交互编程 141 

NET中的数据类型的相互转换;对Matlab提供的Mat类型文 的资源。为了使自定义的Matrix类也具有同样的优点,使其继 

承自IDisposable接口。Matirx类在构造函数中调用mxCreateN. 

件的操作。为了提高对象的内聚度,我们不应该让一个类负担 

太多的责任,可以将这三个功能放在三个不同的类中,通过对象 

之间的组合完成所需的功能。 

首先,分析题域找出可用的模式,对于在.NET中调用Mat. 

1ab的计算功能的用户来说,他们只想通过Matlab完成所需的 

umericMgtrix方法对矩阵所需内存进行分配,在Dispose方法中 

调用mxDestroyArray方法完成程序中创建的Matlab矩阵的删除 

工作,一旦Matirx类中所申请的内存已经不再需要了,就会被列 

为可回收的资源,垃圾回收器会在合适的时候进行内存回收。 

在设计使用中,为了找出为其他模式提供应用背景的模式, 

我们研究模式间的组合寻找以下关系: 

科学计算任务。因此,在设计时我们应该通过一个类向用户屏 

蔽模块中的三个不同的类,为用户提供一个简单一致的界面。 

设计模式中的外观(Facade)模式是对象结构型模式,其意 

个模式是否定义了其他模式的行为; 

图是为系统中的一组接口提供一个一致的界面,该模式定义了 

两个模式是否互相影响。 

个高层接口,这个接口使得子系统更加容易使用。此外,它还 

可以使子系统间的通信和相互依赖关系达到最小。MATFacade 

类采用了外观模式,为Matlab中最常用的功能如打开、关闭 

Matlab引擎,传递参数、执行计算等提供了一个一致的接口,降 

低了客户程序和子系统之间的耦合度,在大多数情况下用户只 

需调用MatFacade类的接口,再由该类去调用子系统中其它的 

类执行相应的功能,简化了系统的使用。 

适配器(Adapter)模式也是对象结构型模式,其意图是将一 

个类的接口转换成客户希望的另一个接口,使得原来由于接口 

不兼容而不能一起工作的类可以一起工作。由于Matlab提供 

的API是基于C语言的,在.NET中属于非托管函数,无法直接 

调用。类MATInvoke和类MatFile采用了适配器模式,完成Mat. 

1ab和.NET之间的接口转换。为了在.NET中调用C语言的 

API,需要利用平台调用(PInvoke)服务。平台调用服务使得托 

管代码可以调用在动态链接库(如Win32API中的DLL)中实现 

的非托管函数。此服务将查找并调用导出的函数,然后根据需 

要跨越调用边界对参数(整数、字符串、数组、结构等)进行封装 

并传送。平台调用服务是通过.NET中的定制特性DllImport来 

实现的。例如启动Matlab引擎的函数engOpen通过以下形式 

在。NET中调用: 

[Dlllmport( libeng.dll )] 

internal static extern IntPtr engOpen(stirng startcmd); 

[Dlllmport(”libeng。dll”)]特性可以让.NET调用Matlab提 

供的动态连接库libeng.dll中打开引擎的导出函数engOpen。 

Matlab提供的所有函数分布在几个动态链接库文件当中,例如 

打开引擎函数engOpen在libeng.dll中,而创建双精度矩阵函数 

mxCreateDoubleMatrix在libmx.dll中,需要加上不同的特性。 

MAT文件是Matlba数据存储的默认文件格式,由文件头, 

变量名和变量数据三部分组成,类MATFile封装了对MAT文件 

的存取功能,该类接收应用程序中传递过来的文件名等参数,然 

后通过平台调用Matlba提供的和MAT文件有关的函数,完成 

打开、关闭MAT文件,将MAT文件中的内容读人Matlba计算引 

擎和将Matlba的矩阵写入MAT文件等功能。类MATInvoke和 

MatFile将Matlab所提供的所有应用程序接口都加上相应的Dl— 

lImport特性封装起来,既实现了跨平台调用又隐藏了不同函数 

位于不同DLL文件中的具体细节。 

设计模式中的代理模式(Proxy)是对象结构型模式,其意图 

是为其他对象提供一种代理以控制对这个对象的访问。使用 

Proxy模式可以实现智能指引(Smart Reference),它可以取代简 

单的指针,在访问对象时执行一些附加操作,例如分配和释放内 

存等。Matirx类通过代理模式实现数据的访问控制,完成。NET 

中的数据类型和Matlab的矩阵类型的互相转换。用户通过这 

个类可以“透明”地完成数据类型转换的功能。在。NET中CLR 

提供了一个先进的垃圾回收器,它可以自动回收托管代码占用 

Facade模式为在.NET调用Maflab的功能提供了一个简单 

致的界面,Adapter模式完成Matlab和.NET之间的接口转换。 

Proxy模式提供了内存访问控制,在需要时才分配内存,用完后 

及时回收。显然,Facade和Adapter、Proxy之间存在关系,A. 

dapter模式和Proxy模式为Facade提供服务,Facade为它们提供 

了应用背景,因此将Facade模式作为设计的出发点,首先建立 

MatFacade类,根据用户的需求为其设计接口函数,然后再根据 

MatFacade类的接口函数划分MatInvoke类、MatFile类和Matirx 

类的责任,并制定相应的接口函数。我们采取自上而下,优先考 

虑类的接口而不是具体实现的设计方法,这样可以在开发过程 

中避免过早陷入具体的技术细节,从而导致各个类的接口混乱, 

设计出来的类高耦合、低内聚,无法进行有效的重用。图1为系 

统的设计类图。 

..

目 

图1 封装Matlab引擎的设计类图 

1。3快速应用开发 

般应用程序开发人员可能并不了解Matlab,只知道要进 

行什么样的计算而且只对计算的结果感兴趣。为了进一步简化 

使用,需要提供一种更便捷的方式调用Matlba的计算功能,最 

好能在开发环境中像使用其他可视化控件,如按钮、文本框一样 

便捷地使用Matlba的计算功能。 

支持快速开发(RAD)是.NET中的一大特性,.NET框架允 

许我们开发自己的用户控件,它像所有.NET本身提供的可视化 

控件一样出现在VisualStudio集成开发环境中。可以将Matlba 

中的计算功能编写成可视化的用户控件(如图2a所示)。控件 

上所加的ToolboxBitmapAttribute特性定义了控件在工具箱中显 

示的图标。用户需要使用Matlba计算功能时,可以直接从开发 

环境中将它“拖放”到应用程序里。下面是建立用户控件的代 

码,“Comput.bmp”指定了在开发环境中显示的控件的图样, 

“TextClicked”说明控件可以通过鼠标点击选取。 

[ToolboxBitmapAttirbute(typeof(MATCtr1.MatComput),”Comput. 

bmp”)DefauhEvent("TextClicked )] 

public class MatComput:System.Windows.Forms.UserControl{… }

2应用实例 

下面以对正弦波的快速傅立叶变换为例,说明如何在。NET 

(下转第151页) 

维普资讯

第1期 周波等:对一种企业级电子表格引擎性能的研究和改进 151 

的“度”平均在1左右,操作在工作簿上均匀分布。 

一、一 ■ ■ 

¨●c● …l … ^ ’ 

表2的测试结果显示,改进后的并发控制机制显著提高了 

~ 计 

“■ 

A “ 

瞬赫 

zt_・¨ 

,B 

’ 

=, 

・1 

多CPU服务器上工作线程的并发度和系统的利用率。 

A 

c・~ …t 

c…l ”・t,E■ 

‘l‘ h… 

、…一I J 

…… 

表2并发控制测试结果 

§u・ 

■t■ 哪 ● 

■ 1 

操作次数 5ooO l0Ooo 2OOoo 5OOoo 

a工具箱中 

b开发环境中 

C应用程序中 

TG 55S l20s 254s 549s 

的FFTr控件 设置参数 设置参数 

图2 

TG+ 28,4s 57.6s l35.2s 292S 

[Description( 陕速傅立叶变换类型”),Editor(typeof(TypeEditor)。 

typeof(UITypeEditor))] 

public string Conve ̄Type{...} 

4 总 结 

另一种方法是在控件加入应用程序后设置参数。用户控件 

可以和系统提供的控件一样响应鼠标点击等系统事件,通过重 

本文结合企业应用的需求和电子表格自身的计算特点。分 

载FVFCtrl类MouseDown函数,用户在应用程序中双击FVFCtrl 

析了在SMP服务器平台上实现电子表格并发控制的性能问题。 

控件,就会弹出参数设置对话框(如图2c所示)。 

提出了对Formula One原有并发控制机制的若干改进方法。并着 

FFI'Ctrl控件从客户的应用程序中接收数据。调用MatFa— 

重介绍了针对电子表格计算特点的锁管理器的设计和公平升级 

cade类执行计算功能,计算完毕之后再由Matirx类将结果转换 

的准则。最后,对已实现的改进方案进行了测试,并得出一些有 

为.NET中的数据格式返回给应用程序,并显示变换结果。应用 

用的结论。 

程序开发人员根本无须关心如何调用Matlab,甚至都不必知道 

上述工作是为企业级电子表格计算引擎研究而服务的。如 

Matlab后台运算的存在。 

‘何提升Formula One系统的性能和可扩展性,使其满足日益增长 

的计算需求,是企业级计算引擎的重要研究课题。本文对这方 

面所取得的阶段性成果进行了总结。 

参考文献 

[1]Tang Jing Fan,Zhou Bo,He Zhi Jun,Urns P.Toward spreadsheet—based 

data management in distirbuted enterprise environment[c].Proceed— 

ings of Computer Supported Cooperative Work in Design,2004:61'4— 

6l7. 

图3使用FFT控件进行计算的结果 

[2]陈扬帆,周波.一种基于区域分布树的电子表格最少重算算法 

[J].计算机应用与软件,2004,21(5):85—88. 

3小 结 

[3]Shasha D,Goodman N.Concurrent search structure algorithms[J] 

ACM Transactions on Database Systems,1988,13(1):53—90. 

模式和设计模式作为软件复用领域他人已经成功运用的经 

[4]Gerhard Weikum.A Theoretical Foundation of Multi—Level Concurrency 

验,存在于系统的分析、设计以及实现等各个阶段。在本文中, 

Contorl[C] Proceedings of the fifth ACM SIGACT—SIGMOD symposi— 

通过运用模式进行分析和设计,为在 NET中调用Matlab设计 

um on Principles of database systems,1986:31—42. 

了一组可重用的类,开发者使用这组类,可以方便的实现对 

[5]Larson P,Krishnan M Memory Allocation for Long—Running Server Ap- 

Matlab计算功能的调用,而无需了解具体的技术细节,从而使得 

plications[C] In International Symposium on Memory Management, 

开发人员可以将更多的精力集中到特定的应用上去。而且该方 

Vancouver,B C,Canada,1998.

圜 

 

[6]Bernstein P A,Hadzilacos V,Goodman N.Concurrency Contorl and Re— 

法为如何将其他优秀的原生Windows程序移植到,NET平台提 

covery in Database Systems[M] Massachusetts:Addison—Wesley, 

供了设计思路。 

1987:60—64 

参考文献 

[7]SleepyCat Software.Synchronization in the Locking Subsystem,Berke— 

ley DB 4 4 source code,http://dev sleepycat corn/documentation/ 

[1]Erich Gamma,Richard Helm,Ralph Johnson,et al 设计模式:可复用 

bdb html,2005 ’ 

面向对象软件的基础 李英军。马晓星,等译 北京:机械工业出 

[8]Vigyan Singhal,Alan Jay Smith,Analysis of Locking Behavior in Three 

版,2000. 

Real Database Systems[J].VLDB Journal,1997,6(1):40—52 

[2]Alan Shalloway James R.Trott Desing Patterns Explained 北京:中国 

电力出版社,2003. 

[3]Jeff Prosise.Microsoft NET程序设计技术内幕 王铁,徐雅骥,童霞, 

(上接第141页) 

中调用Matlab的计算功能。该控件提供了两种方法设置快速 

刘宇,译.北京:清华大学出版社,2003. 

[4]Jeffcry Richter Microsoft NET框架程序设计 修订版.李建忠,译. 

傅立叶变换的参数,一种是在集成开发环境中,通过在控件的属 

北京:清华大学出版社,2003. 

性加上定制特性,如给FFFCtrl控件的变换类型属性Convefl— 

[5]张志涌。等.精通Matlab 6.5版.北京:北京航空航天大学出版社。 

Type加上Description特性,当在开发环境中选择FFFCtrl控件 

2003. 

时,就会在开发环境的属性栏中出现对应的参数设置。如图2b 

[6]Carig Larman。UML和模式应用面向对象分析与设计导论.姚淑 

所示。 

珍。李虎。等译.北京:机械工业出版,2002。 


本文标签: 模式 控件 计算 提供 使用