Matlab和java混合编程开发

   如果用Matlab和java混合编程开发Windows的应用程序则可以实现优势互补,缩短开发时间,降低程序设计的复杂度。同时程序可以脱离Matlab环境独立运行,在工程计算和教学实践中都具有实际意义。

1.使用java调用Maltab函数的基本方法是:通过Java Builder实现Java调用Matlab。在Java环境中直接调用Matlab所生成的Jar包。

下面以在Java中产生任意维数的魔方矩阵,计算任意矩阵的特征向量和特征值,对两组数据进行拟合并绘制拟合曲线三个实例来说明通过Java Builder实现Java调用Matlab的过程。传统的纯Java编程实现上述实例非常复杂,甚至很难完成。这一问题在Matlab中只需要调用几个函数即可完成。

1.1、将Matlab函数包装成Java类

首先在Matlab中编写三个M文件:

Eig.m

function [v,d]=Eig(input)

format long

[v,d]=eig(input);

End

Magic.m

function f =Magic( input )

f=magic(input);

end

Plot.m

function Plot(x,y )

p=polyfit(x,y,3);

t=min(x):max(x)/100:max(x);

s=polyval(p,t);

plot(x,y,'*',t,s);

title('数据拟合结果');

xlabel('x');

ylabel('y');

end

其次,在Matlab中新建一个Deployment Project,名称为MyProject.prj,类型为Java package。在Project中新建三个Class,分别为GetEig,GetMagic,PolyFit。将Eig.m,Magic.m,plot.m分别添加到上述Class中。之后点击Builder the project,等待编译成功即可。

1.2、在Java中调用Matlab函数

新建一个Java类JavaMatlab,并引入相关的包。

import com.mathworks.toolbox.javabuilder.*;//引入Matlab相关包

import MyProject.*;//引入建立的包及类

调用时Java与Matlab之间的参数传递需要通过MWNumericArray完成。具体的调用代码如下:

package org.genius.ExpandJava;

import MyProject.*;

import com.mathworks.toolbox.javabuilder.*;

public class JavaMatlab {

   public static void main(String[] args) {

      MWNumericArray a = null; // 用于保存矩阵

      MWNumericArray ax = null; // 用于保存矩阵

      MWNumericArray ay = null; // 用于保存矩阵

      Object[] result = null; // 用于保存计算结果

      GetEig getEig = null;

      GetMagic getMagic=null;

      PolyFit polyFit=null;

      int r = 4; // 魔方矩阵维数

      int array[][]={{50,-20,0},{-20,80,60},{0,60,-70}};

      double x[]={0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1};

      double y[]={-0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.3,11.2};

      try {

            //产生魔方矩阵并打印

         a = new MWNumericArray(r, MWClassID.DOUBLE);

         getMagic = new GetMagic();

         result = getMagic.Magic(1,a);

         System.out.println("产生的四维魔方矩阵:");

         System.out.println(result[0]);

         MWArray.disposeArray(result);

          //计算所给矩阵的特征向量和特征值并打印结果 

         a = new MWNumericArray(array, MWClassID.DOUBLE);

         getEig = new GetEig();

         result = getEig.Eig(2, a);

         System.out.println("原始矩阵:");

         System.out.println(a.toString());

         System.out.println("得到的特征向量:");

         System.out.println(result[0]);

         System.out.println("得到的特征值:");

         System.out.println(result[1]);

         MWArray.disposeArray(result);

         ax = new MWNumericArray(x, MWClassID.DOUBLE);

         ay = new MWNumericArray(y, MWClassID.DOUBLE);

         polyFit = new PolyFit();

         result=polyFit.Plot(ax,ay);

         polyFit.waitForFigures();

      } catch (Exception e) {

         System.out.println("Exception: " + e.toString());

      }

 

      finally {

         // 释放本地资源

         MWArray.disposeArray(a);

         MWArray.disposeArray(ax);

         MWArray.disposeArray(ay);

         MWArray.disposeArray(result);

         getEig.dispose();

         getMagic.dispose();

         polyFit.dispose();

      }

 

   }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值