Java高效矩阵运算库EJML使用
1 引言
在编写算法时,常涉及到矩阵的相关计算,包括加、减、乘、除、转置、求逆等,Efficient Java Matrix Library(EJML)是第三方高效矩阵运算包,对其用法进行记录和总结。
2 自动导入Jar包
3 使用SimpleMatrix创建矩阵
3.1 通过SimpleMatrix创建一个空矩阵
创建一个2x4的空矩阵matrix(全部为0)。
SimpleMatrix matrix = new SimpleMatrix(2,4);
System.out.println(matrix);
输出为:
Type = DDRM , rows = 2 , cols = 4
0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
3.2 通过SimpleMatrix创建一个空矩阵
double[][] array_2D_double = new double[3][5];
SimpleMatrix matrix_2D_double = new SimpleMatrix(array_2D_double);
System.out.println(matrix_2D_double);
4 SimpleMatrix矩阵运算
4.1 矩阵加减法
矩阵加法:SimpleMaxtrix.plus()
矩阵减法:SimpleMaxtrix.minus()
初始化矩阵A为35,值全为1;矩阵B为35,值全为2。令C=A+B。其中A和B必须为同型矩阵,若不为同型矩阵,则报错Exception in thread “main” org.ejml.MatrixDimensionException: Must be same shape.
SimpleMatrix matrixA = new SimpleMatrix(3, 4); //创建4x4的矩阵A
SimpleMatrix matrixB = new SimpleMatrix(4, 4); //创建4x4的矩阵B
matrixA.fill(1); //将A的所有元素设为1
matrixB.fill(2); //将B的所有元素设为2
System.out.println(matrixA);
System.out.println(matrixB);
SimpleMatrix matrixC = matrixA.plus(matrixB);
System.out.println(matrixC);
4.2 矩阵乘法
初始化矩阵A为35,值全为1;矩阵B为35,值全为2。令C=AB,D=BA。注意AB和BA结果不一样。其中矩阵AB能够相乘要满足A的行数=B的列数,否则报错: Exception in thread “main” org.ejml.MatrixDimensionException: 5 != 4 The ‘A’ and ‘B’ matrices do not have compatible dimensions.
SimpleMatrix matrixA = new SimpleMatrix(5, 3); //创建4x4的矩阵A
SimpleMatrix matrixB = new SimpleMatrix(3, 5); //创建4x4的矩阵B
matrixA.fill(1); //将A的所有元素设为1
matrixB.fill(2); //将B的所有元素设为2
System.out.println(matrixA);
System.out.println(matrixB);
SimpleMatrix matrixC = matrixA.mult(matrixB);
System.out.println(matrixC);
SimpleMatrix matrixD = matrixB.mult(matrixA);
System.out.println(matrixD);
4.3 矩阵的数乘
一个标量×一个矩阵=该标量×矩阵中的每一个元素。SimpleMatrix中使用scale()方法实现。
4.4 矩阵+标量(plus)
在线性代数中,只有相同维数的矩阵可以相加,相同维数的向量可以相加,而没有定义矩阵与标量、向量的加法。在numpy中,允许矩阵与标量、向量相加,产生另一个矩阵(广播)。
矩阵+标量:标量与矩阵中的每一个元素相加。(numpy、SimpleMatrix都可实现)
矩阵+向量:向量与矩阵的每一行(或列)相加(numpy广播,SimpleMatrix则不可)。
//矩阵的数加
SimpleMatrix matrixB = new SimpleMatrix(3, 5); //创建4x4的矩阵B
matrixB.fill(2); //将B的所有元素设为2
SimpleMatrix matrixF = matrixB.plus(3);
System.out.println(matrixF);
4.4 矩阵+向量
在numpy中,矩阵可以和向量相加。在SimpleMatrix,若是使用plus()则会报错。运行一下代码会报错:Exception in thread “main” org.ejml.MatrixDimensionException: Must be same shape. 4x4 vs 4x1.
double[] x = ThreadLocalRandom.current().doubles(0, 1).distinct().limit(4).toArray();
SimpleMatrix m = new SimpleMatrix(4, 1, false, x);
System.out.println(m);
SimpleMatrix H = new SimpleMatrix(4, 4);
System.out.println(H.plus(m));
4.4 矩阵对应元素相乘
SimpleMatrix中使用elementMult()方法实现对应元素相乘。
SimpleMatrix A = new SimpleMatrix(2, 4);
SimpleMatrix B = new SimpleMatrix(2, 4);
A.fill(2);
B.fill(3);
System.out.println(A.elementMult(B));
输出
Type = DDRM , rows = 2 , cols = 4
6.0000E+00 6.0000E+00 6.0000E+00 6.0000E+00
6.0000E+00 6.0000E+00 6.0000E+00 6.0000E+00