MATLAB和JAVA的混合编程研究与实现
- 格式:pdf
- 大小:1.46 MB
- 文档页数:4
收稿日期:2008-05-26作者简介:任文杰(1982—),男,
河北枣强人
,硕士研究生,专业方向为控制理论与控制工程;王伟(1957—),男,山西夏县人,教授,博士生导师,主要从事飞行控制与仿真,自适应控制的研
究;马松辉(1977—),男,河南巩义人,工程师,主要从事飞行控
制与仿真方面的研究;陈怀民(1963—),男,安徽涡阳人,副教
授,硕士生导师,主要从事飞行控制与仿真的研究。MATLAB和JAVA的混合编程研究与实现
任文杰,王 伟,马松辉,陈怀民
(西北工业大学无人机特种技术国家重点实验室,陕西西安 710065)
摘要:为充分发挥MATLAB和JAVA的优势,提出基于两者的混合编程技术。混合编程的关键是数据传
输问题,在此采用接口技术。研究了MATLAB和JAVA在本地环境和网络环境下的混合编程方法,通过
多个实例说明两者混合编程的过程和步骤。
关键词:MATLAB;JAVA;混合编程
中图分类号:TP29 文献标识码:A 文章编号:1000-8829(2009)01-0077-03
ResearchandImplementationofMixed2Language
ProgrammingBasedonMATLABandJAVA
RENWen2jie,WANGWei,MASong2hui,CHENHuai2min
(NationalLaboratoryofUAVSpecialTechnology,NorthwesternPolytechnicalUniversity,Xi’an710065,China)
Abstract:InordertofullyplaytheadvantagesofMATLABandJAVA,amixed2languageprogrammingtechnol2
ogybasedonthetwolanguagesisproposed.Thekeyofmixed2languageprogrammingistheissueofdatatrans2
mission,hereinterfacetechnologyisadopted.Themixed2languageprogrammingofJAVAandMATLABinthe
localenvironmentandnetworkenvironmentisstudied.Someexamplesshowmixed2languageprogramming
processandstepsofthisprocess.
Keywords:MATLAB;JAVA;mixed2languageprogramming
MATLAB是目前学术界和工程界最为流行的科学
计算工具,它集数值计算、符号运算、矩阵计算、信号
处理和图形显示于一体,同时各个领域不断推出新的
MATLAB工具箱,这些工具箱给各个领域的研究和工
程应用提供了方便、有力的工具。它不仅包括方程求
解、多项式计算、数学的极值计算,而且在金融系统、工
业系统仿真和统计等诸多领域都得到了广泛的应用。
JAVA是面向对象程序语言,其语言本身的安全
性很高并引入了一些日益重要的复杂任务,比如多线
程和网络编程,这些工作用JAVA实现起来轻而易举。
然而,JAVA在数据分析和处理方面的能力却不那么
突出,尤其是在对数组矩阵之类数据进行操作时会因
为多次循环而速度变得缓慢,这在数组或矩阵维数很大时缺点尤为突出。
在一个应用软件的开发周期中,把不同阶段的算
法和数据处理交给在这方面具有优势的编程语言或软
件,相比用单一语言开发同等性能的程序,它需更少的
时间,大大缩短了开发时间。为了降低这种程序设计
的复杂度,绝大多数情况下都借助几种不同程序开发
语言混合编程的手段予以解决,利用每种语言在其某
一方面的优势实现相互互补,于是就把复杂度问题转
换为不同语言之间相互传递数据的问题。
1 混合编程
混合编程主要是为那些编程语言实现相同算法效
率相差很大;不同软件间除了数据通信,其他相互独
立;并且不同软件间数据通信相对比较方便而提出的
编程思想。满足以上编程条件就可以采用混合编程,
它可以大幅提高开发速度,明显改善软件质量。混合
编程面临的主要问题是如何在不同语言(软件)之间
进行数据传输。
MATLAB对多线程实现方面无能为力,但是对数
据操作方面却有明显的优势。MATLAB有超过500种
数学、统计、科学及工程方面的函数可使用,一条语句・77・MATLAB和JAVA的混合编程研究与实现便可完成十分复杂的任务。当一个JAVA程序员要开发一个涉及到大规模数据运算、分析和比较的程序时,
可以借助MATLAB在数据处理方面的优势来提高编程效率和运行速度。
从MATLAB6开始,JAVA被完全集成到了MAT2
LAB开发环境中。MATLAB6.0之后的版本都自带了
一个JAVA虚拟机(JVM),在MATLAB命令行环境和
MATLAB函数中可以创建和使用JAVA虚拟机支持的
任何JAVA对象。因此MATLAB与JAVA之间进行数
据传输也就很简单了,适合混合编程。
2 MATLAB和JAVA混合编程的本地
方法
2.1 JAVA程序直接调用MATLAB命令
MATLAB自身带的jmi.jar包为JAVA调用MAT2
LAB提供了接口,只需把该jar包添加JAVA的运行环
境中即可调用其中的类。其中主要的方法:eval主要
用于调用MATLAB中的函数;feval主要调用MATLAB
中自己定义的M函数或S函数。
以文献[3]中的旅行商问题说明,文献[3]中采用
的数据流保存文件的形式来传输数据,在此采用
MATLAB提供的接口进行数据的传输。
首先定义一个Commercial_Traveler类,保存途径
地点的X坐标和Y坐标(也可以是途经地点的其他标
识),程序如下:
JAVA程序:……
publicclassCommercial_Traveler{
publicObject[][]coordinate;
publicCommercial_Traveler(Object[][]coordinate){
//构造函数,用于初始化Commercial_Traveler对象
this.coordinate=coordinate;
}
publicdouble[]DataFromMatlab(){
//该方法用于与Matalb之间的调用
Matlabmatlab=newMatlab();
double[][]value;
try{
//调用M函数
Object[][]ob2=matlab.feval("Commercial_Traveler",coordi2
nate);
value=(double[][])ob2;
}catch(Exceptione){}
returnvalue;
}
PublicvoidPlot_Path(double[][]value){
XYSeriesCollectiondatabase=newXYSeriesCollection();
XYSeriesseries=newXYSeries("PathData");for(inti=0;i
series.add((double)(i/10),value[i]);……
database.addSeries(series);
JFreeChartxychart=ChartFactory.createXYLineChart(
"Path","X","Y",database,PlotOrientation.VERTICAL,true,
true,false);
xychart.setBackgroundPaint(Color.lightGray);……
FinalXYPlotplot=(XYPlot)xychart.getPlot();……
}其中与MATLAB调用时的Commercial_Traveler
为M函数,是根据文献[3]编写而成的。
functiony=Commercial_Traveler(agrs)
//把途经地点的坐标传入
agr=agrs(1)
……
//计算过程参见文献[3],在此不再赘述。
运行结果如图1所示,可以看出与文献[3]的结
果相同。
图1 JAVA调用M函数运行图
2.2 MATLAB调用JAVA程序
首先把编写好的程序编译后把class文件打成jar
包,然后把该jar包放到MATLAB的工作路径下,即可
在MATLAB的命令窗口里直接调用jar包中的成员变
量和类的方法。但是应注意的是要在MATLAB中调
用的变量或方法必须要声明为public类型。
下面程序实现在S函数里调用一段JAVA程序,
JAVA程序完成的是一个画曲线的功能。
……
publicCurve(Stringtitle){
super(title);
series=newXYSeries("");・87・《测控技术》2009年第28卷第1期series.setMaximumItemCount(128);
finalXYSeriesCollectiondatabase=newXYSeriesCollection(se2ries);
finalJFreeChartxychart=
ChartFactory.createXYLineChart(
"Curve","time","value",database,
PlotOrientation.VERTICAL,
false,true,false);……
}
publicstaticvoidupDate(doubletime,doublevalue){……
series.add(time,value);
}
publicstaticCurvegetInstance(){
returncv;
} 调用JAVA程序的S函数
……
//把编译好的jar加到工作路径下
javaaddpath(′……\Curve.jar′)
//调用类的主方法
curve.Curve.main(′′);……
//得到一个实例
functionsys=mdlUpdate(t,x,u)
……
Javacurve=curve.Curve.getInstance();
//更新数据
Javacurve.upDate(t,u);……
仿真结果如图2所示。
图2 Matlab调用JAVA程序运行图
3 MATLAB和JAVA混合编程的网络
方法
JMatLink是由德国StcfanMuller开发,旨在为JA2VA语言与MATLAB建立接口,任何MATLAB功能函
数都能够被JAVA程序调用。在参考JMatLink的基础
上,建立了自己的Java类JMatBridge,利用Java中的
feval和eval方法,采用UDP传输协议进行网络通信。
用JAVA实现客户端,采用JAVAAPPLET技术开
发用户界面并将其嵌入到网页中;服务端包括MAT2
LAB程序、处理用户请求并与MATLAB进行通信的服
务器程序。图3为网络结构图,其工作的过程为:
①通过浏览器向服务器提交服务请求;
②服务器根据请求提供服务,浏览器加载applet
小应用程序;
③applet完成初始化,然后进入运行状态,通过
JMatBridge向MATLAB程序提出请求;
④MATLAB根据请求返回数据,JAVA程序根据
数据完成绘制曲线功能。
图3 网络结构图……
publicvoidinit(){……
series=newXYSeries("SinData");finalXYSeriesCollectiondata=newXYSeriesCollection(series);finalJFreeChartchart=ChartFactory.createXYLineChart(