第23卷第1期2008年1月
海军航空工程学报
JournalofNavalAeronauticalandAstronauticalUniversity
Vol.23
NO.1
Jan.2008
文章编号:1673-1522(2008)01-0109-03
MATLAB与Visual
C#.NET混合编程
焦纲领,邓建辉,韩啸
(海军装备研究院.北京100073)摘要:在分析MATLAB与Visualc}}.NET适用性和优缺点的基础上,介绍了MATLAB和VisualC#.NET混合编程的设计思想和编程特点.接着具体给出了基于Visualc#.NET开发应用程序调用MATLAB算法的实现方法,并重点结合实例阐述了运用COM组件技术混合编程的具体步骤和注意事项.关键词:MATLAB;Visualc#.NET;混合编程;COM中图分类号:TP391.9文献标志码:A
1概述
MATLAB是1984年由美国MathWorks公司推
CLR的中心思想就是提供一个多种应用程序接口
(ApplicationProgramInterface,API)的中间层,
作用于低级的WindowsWin32API功能和应用程序代码之间.Visual
出的,国际上公认的最优秀的数值计算和仿真分析软件,其强大的科学计算与可视化功能,简单易用的开放式可扩充环境以及几十个面向不同领域的扩展工具箱(Toolbox)支持,使得MATLAB在许多工程技术学科领域成为计算机辅助设计与分析,仿真算法研究和应用开发的基本工具和首选平台川.
从MATLAB6.5开始.MathWorks公司在MATLAB
C样.NET是Visual
Studio.NET软
件开发包的重要组成部分,其编程语言C舟是微软推出的一种面向对象的程序设计语言,它结合了许多新的功能和特点,这些特点是富有经验的C,C++
和VisualBasic程序员过去不曾使用过的.Visual
C群.NET已经逐渐成为开发应用程序,特别是开发网络应用程序的首选.基于以上分析,应用MATLAB和Visual
产品家族中加入了名叫MATLABCOMBuilder的模块(新版已更名为MATLAB
Builder
for.NET),
c{I}.NET进行混合编程,即利用MATLAB强大的数
值计算能力进行核心算法设计编程,利用VisualC}}.NET进行用户应用程序界面设计开发,能充分利用两者的优点,应用前景广阔.本文将结合实际开发例子进行混合编程的论述.
2
.
它是MathWorks公司推荐用于混合编程的.然而,MATLAB自身也有其弱点:MATLAB以解释方式执行程序,效率较低;不能脱离其运行环境,因此不能用于开发商用软件;MATLAB的程序是后缀为m的脚本文件,它对于用户完全透明,因此用户可以任意进行修改,但有时为了维护代码的完整性和安全性,或者出于保护专有算法的目的,'不希望用户了解或更改核心程序;MATLAB界面开发能力比较薄弱,不能满足用户的高级要求..NET技术是微软公司推出的一个全新概念,它代表了一个集合,一个环境,一个编程的基础121..NET编程语言组与以前版本的Windows编程语言的区别是在Windows系统中建立程序和运行程序的方法不同.微软.NET技术的核心是公共语言运行时(Common
Language
MATLAB与VisuaIC群.NET混合编程
MATLAB与VisualC撑.NET混合编程方法基本
有3种:①直接在Visualc样.NET中通过MATLAB引擎调用在MATLAB中编写的程序;②用COMBuilder把MATLAB中编写的程序打包成COM组件,然后在Visual
c静.NET直接引用;③按照COM
Builder的语法,在VisualC#.NET中直接书写
MATLAB语句.3种方法中.第二种混合编程方法最能发挥MATLAB与VisualC#.NET的优点,在实际应用巾也用的最多,本文重点对这种方法详细介
Runtime,CLR)环境.
收稿日期:2007.08.29作者简介:焦纲领(1972一).男,工程师,硕士.
万方数据
·llO·
海军航空工程学报
第23卷
绍.
2.1
fis—comtest
1.0.dIK它就是做好的COM组件).Build
MATLAB下做COM组件
COM是ComponentObjectModule的简称,它
时候MATLAB已自动将此dIl在注册表中注册,为以后能用其他编译器调用,还需做一个准备工作.开一个命令行窗口.进入
/bin/win32目录下(为你机器上MATLAB的安装路
经),打regsvr32mwcomutil.dll,即对mwcomutil.dil
是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它.MATLAB6.5新推出
来的COMBuilder就是把MATLAB下编写的程序
进行注册(这个文件是MATLAB下作的任何COM组件都要用到的),下面我们在其他编译器下调用时就可以用了.为了能调用fis_comtest_1.0.dll.还需要将其添加到系统的路径中,在设置一控制面板一系统一高级一环境变量一系统变量中找PATH,双击.在编辑系统变量中,找到该COM的路径.点击确定
即可.
2.2Visual
做成COM组件.供其他语言和开发工具调用.[31我们以一个利用MATLAB中的模糊逻辑工具
箱(FuzzyLogicalToolbox)构建的模糊推理系统
fis_comtest.m作为测试文件.部分程序清单如下:function【output】=fis_comtest(input_);%文件是单输入单输出,但输入和输出参数都是数组.……%省略部分为构造的模糊推理系统.
fis=struct('name',【'NSSOCSl'】,.type.,【'mamdani'】,'andMethod.,【.min'】,'orMethod',【'max.】,'defuzzMethod''【'centroid'】,.impMethod',【.rain'】,'aggMethod.,【.max.】,'input',input,.output.,output..rule',rule);
numofpoints=101;
C#.N盯下实现调用
在VisualC静.NET下调用COM组件一般有以下
两种方法,一是运用类型库导人程序Tlbimp.cxe;二是直接在VisualC静.NET下调用.
2.2.1类型库导入程序调用
【output,IRR,ORR,ARR】=evalfismex(input_.fis,numofpoints);
类型库导人程序(Tlbimp.exe)将COM类型库中的类型定义转换为公共语言运行库程序集中的等效定义.其基本步骤为:1)将COM类信息转化为.NET元数据.例如将一个COM类库文件mytestcom.fib转化为.NET元数据,该COM对象包括一个接口Igreeter.该接口包含一个Hello方法:tlbimp
mytestcom.tlb/nolog.
fis_eomtest.m文件最后一句中的evalfismex是MATLAB模糊逻辑工具箱中一个动态链接库,动态链接库(DLL)在MATLAB中称为MEX文件.这
是MATLAB6.5版本以上中COMBuilder新添加的
功能.Evaifismex是用来进行模糊推理的,因为能够直接引用MATLAB中自带的MEX文件,节省了用户大量的时间,极大地提高了编程效率.14.5I编写好M文件后,在MATLAB的命令窗口巾
输入comtool,一就打开了MATLABCOM
上述命令生成mytestcom.dll.2)查看元数据.可使用MSIL反汇编程序Ildasm.exe查看元数据.Ildasm.exe可分析任何.NET信息.Ildasm.exe不只是显示Microsoft中间语言(MSIL)代码,还显示命名空间和类型,含其接121.3)在项目中调用.源程序如下:
usingSystem;namespaceTestCom
BuiIder—Framework.exe或.dll程序集,并以可读的格式显示
in选C
Handle
点击File下的NewProject,新建一个工程,在
Component
name里填上fis_comtest,calsses里自动
code
生成fis_comtest的Classname,Complie
或C++都可以,将Complieroptions里的Use
Graphics
Library的复选框画上,点击OK.然后点
击ProjectlAddfiles,将fis_comtest.m文件和
evalfismex.d11分别添加入工程.注意,这里m文件和mex文件的位置有一个特别的要求,mex文件必
须位于m文件的上一目录下.例如,如果
{
class
App
IISTAThread】
static
fis_comtest.m位于D:\fis\fis_comtest下,则evalfismex.dll必须位于DAfis下.添加完m文件和mex文件后.点击BuildlComObject,然后package.就会在fis_comtest\distrib\文件夹下生成一个
voidMain(string[】args)
{Console.WriteLine("pressanykeyexit");mytestCom.CgreeterClass.greeter=new
万方数据
第l期
焦纲领等:MATLAB与Visual删.NET混合编程
mytestCom.CgreeterClass0;%应用mytestComGreeter.Hello("hello,world");Console.ReadLine0;
.
objectoutput_=null;nss.mytestcom(1.refoutput_);//调用函数
mytestcom.计算模糊输出
Console.WriteLine("output_={0l",output_);
decimal
lIl
output_=Decimal.Parse(
上一篇:Lonwork与BACnet的区别
下一篇:马原:环境保护与可持续发展论文(word)