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(