一、
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。