Java和matlab混合编程

    xiaoxiao2021-03-25  62

    如果用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();

          }

     

       }

    }

    转自:http://m.blog.csdn.net/article/details?id=24719875

    转载请注明原文地址: https://ju.6miu.com/read-33194.html

    最新回复(0)