当前位置: 首页 > 工具软件 > JAMA > 使用案例 >

Java 计算包 ejml 、 jblas及Jama 矩阵计算性能比较

祁刚毅
2023-12-01

一、

1.Ejml全称为Efficient Java Matrix Library,一款高效的数运算java库,主要是矩阵计算,官网org.ejml。

2.jblas是一个快速的Java线性代数库。它是基于BLAS与LAPACK。其中提供了矩阵计算。官网:http://jblas.org/

3.jama是一个基本的线性代数java包,它提供了实数非稀疏矩阵类。

其中jama 是一个比较初级的计算包,没有什么优化,个人感觉对于大矩阵计算性能很差,偶尔看了一下源代码,生成单位阵时居然用的是二重循环。

下面对几个矩阵计算进行了一下性能比较。

二、性能测试

主要测试了拼接、相乘、逆(其中jblas计算的是伪逆)

1.Ejml测试

moven 中加入
<dependency>
    <groupId>org.ejml</groupId>
    <artifactId>ejml-all</artifactId>
    <version>0.40</version>
</dependency>
   void TstEjmpMatrix() {

        DMatrixRMaj x=new DMatrixRMaj(2000,5000);
        DMatrixRMaj y=new DMatrixRMaj(2000,5000);
        DMatrixRMaj z=new DMatrixRMaj(5000,4000);
        DMatrixRMaj r=new DMatrixRMaj(4000,5000);
        DMatrixRMaj r1=new DMatrixRMaj(4000,4000);
        for(int i=0;i<x.numRows;i++)
        {
            for(int k=0;k<x.numCols;k++)
            {
                x.unsafe_set(i,k,i*2+k+1);
            }
        }
        System.out.println("aaaa\n");
        for(int i=0;i<y.numRows;i++)
        {
            for(int k=0;k<y.numCols;k++)
            {

                y.unsafe_set(i,k,i*3+k+2);
                // System.out.print("  "+y.get(i,k));
            }
            // System.out.println();
        }
        System.out.println("\n");

        for(int i=0;i<z.numRows;i++)
        {
            for(int k=0;k<z.numCols;k++)
            {

                z.unsafe_set(i,k,i*3+k+2);
                // System.out.print("  "+y.get(i,k));
            }
            // System.out.println();
        }
        System.out.println("\n");

        CommonOps_DDRM.concatRows(x,y,r);

        CommonOps_DDRM.mult(r,z,r1);
        org.ejml.simple.ops.SimpleOperations_DSCC();


        CommonOps_DDRM.invert(r1,r1);


        for(int i=0;i<x.numRows;i++)
        {
            for(int k=0;k<x.numCols;k++)
            {

               // System.out.print("  "+x.get(i,k));
            }
          //  System.out.println();
        }


    }

2.jblas测试

<dependency>
    <groupId>org.jblas</groupId>
    <artifactId>jblas</artifactId>
    <version>1.2.4</version>
</dependency>
    void TstJblasMatrix() {
        DoubleMatrix x=new DoubleMatrix(2000,5000);
        DoubleMatrix y=new DoubleMatrix(2000,5000);
        DoubleMatrix z=new DoubleMatrix(5000,4000);

        for(int i=0;i<x.rows;i++)
        {
            for(int k=0;k<x.columns;k++)
            {
                x.put(i,k,i*2+k+1);


               // System.out.print("  "+x.get(i,k));
            }
           // System.out.println();
        }
        System.out.println("\n");
        for(int i=0;i<y.rows;i++)
        {
            for(int k=0;k<y.columns;k++)
            {

                y.put(i,k,i*3+k+2);
               // System.out.print("  "+y.get(i,k));
            }
           // System.out.println();
        }
        System.out.println("\n");

        for(int i=0;i<z.rows;i++)
        {
            for(int k=0;k<z.columns;k++)
            {

                z.put(i,k,i*3+k+2);
                // System.out.print("  "+y.get(i,k));
            }
            // System.out.println();
        }
        System.out.println("\n");
    
        x=DoubleMatrix.concatVertically(x,y);
        x=x.mmul(z);
        x= Solve.pinv(x);

        for(int i=0;i<x.rows;i++)
        {
            for(int k=0;k<x.columns;k++)
            {

                //System.out.print("  "+x.get(i,k));
            }
            //System.out.println();
        }


    }

3.Jama测试

maven文件

<dependency>
<groupId>gov.nist.math</groupId>
<artifactId>jama</artifactId>
<version>1.0.2</version>
</dependency>
    void TstJamaMatrix() {
        Matrix x=new Matrix(4000,5000);
        Matrix y=new Matrix(4000,5000);
        Matrix z=new Matrix(5000,8000);

        Matrix [] xy=new Matrix[2];
        for(int i=0;i<x.getRowDimension();i++)
        {
            for(int k=0;k<x.getColumnDimension();k++)
            {
                x.set(i,k,i*2+k+1);

                // System.out.print("  "+x.get(i,k));
            }
            //System.out.println();
        }
        System.out.println("\n");
        for(int i=0;i<y.getRowDimension();i++)
        {
            for(int k=0;k<y.getColumnDimension();k++)
            {

                y.set(i,k,i*3+k+2);
                //System.out.print("  "+y.get(i,k));
            }
            // System.out.println();
        }
        System.out.println("\n");
        MatrixTool tool=new MatrixTool();
        xy[0]=x;
        xy[1]=y;
        x= tool.rBind(xy);

        for(int i=0;i<z.getRowDimension();i++)
        {
            for(int k=0;k<z.getColumnDimension();k++)
            {

                z.set(i,k,i*3+k);
                // System.out.print("  "+y.get(i,k));
            }
            // System.out.println();
        }
        System.out.println("\n");
        x=x.times(z);
        x=x.inverse();
        for(int i=0;i<x.getRowDimension();i++)
        {
            for(int k=0;k<x.getColumnDimension();k++)
            {

                //System.out.print("  "+x.get(i,k));
            }
            //System.out.println();
        }

    }

每个程序运行了三次,测试结果平均值为:Ejml运行结果为2分27秒534毫秒。jblas包运行结果为:3分40秒706毫秒。Jama包在求逆时出错退出,原因是矩阵为奇异的,运行结果为:10分50秒376毫秒。

由此可看出,Jama对于稍大一点的矩阵计算性能极差。性能最好的是Ejml。

 

 

 类似资料: