Jama是一个非常好用的Java的线性代数软件包。适用于日常编程可能碰到的各种矩阵运算问题,提供了一个优雅的简便的解决方案。
- 官网链接:JAMA: Java Matrix Package (nist.gov)
原本只是搬砖式的项目工程到后半部分就卡壳了,没有合适的算法来支撑,在经过各种脑洞和论文后,最后还是老老实实的捡回线性代数,尝试着一步步去推导。
Maven引入功能gov.nist.math jama 1.0.3
Jama由6大类组成:Matrix, CholeskyDecomposition, LUDecomposition, QRDecomposition, SingularValueDecomposition和 EigenvalueDecomposition。
Matrix 类提供数值线性代数的基本运算。 各种构造函数从双精度浮点数的二维数组创建矩阵。 各种获取和设置提供对子矩阵和矩阵元素的访问。 基本的算术运算包括矩阵加法和乘法、矩阵范数和选定的逐元素数组运算。 还包括一种方便的矩阵打印方法。
矩阵的五大分解,对应于Jama的五个矩阵分解类,依次为:
- 对称正定矩阵的Cholesky分解 CholeskyDecomposition
- 矩阵的LU分解(高斯消元)LUDecomposition
- 矩阵的QR分解 QRDecomposition
- 对称和非对称矩阵的特征向量值分解 EigenvalueDecomposition
- 矩阵的奇异值分解 SingularValueDecomposition
这些分解类可以由Matrix 类访问,可以求解线性方程组,求解行列式,求逆和其他矩阵运算。
目前的Jama仅处理实数矩阵。
使用 例子// 求解 3x3 线性系统 Ax=b 并计算残差的范数
double[][] array = {{1.,2.,3},{4.,5.,6.},{7.,8.,10.}};
Matrix A = new Matrix(array);
Matrix b = Matrix.random(3,1);
Matrix x = A.solve(b);
Matrix Residual = A.times(x).minus(b);
double rnorm = Residual.normInf();
Matrix
文档:Matrix (nist.gov)
构造// 1. 从2维数组转换 Matrix(double[][] A); // 2. 快速构造(不检查参数) Matrix(double[][] A, int m, int n); // 3. 从1维压缩数组构造函数 Matrix(double[] vals, int m); // 4. 构造m*n的空矩阵(以0填充) Matrix(int m, int n); // 5. 构造m*n的矩阵 Matrix(int m, int n, double s); // 6. m*n单位矩阵 Matrix.identify(int m, int n); // 7. m*n随机矩阵 Matrix.random(int m, int n);基本函数
// 1. Matrix转换为double[][]形式 A.getArray(); // 2. 获取Matrix行数 A.gerRowDimension(); // 3. 获取Matrix列数 A.getColumnDimension(); // 4. 获取位于[i][j]的元素 A.get(i,j); // 5.获取[i1][j1]-[i2][j2]范围内的矩阵 getMatrix(int i1, int i2, int j1, int j2); // 举例: A为4*5的矩阵 A.getMatrix(0,4,5,5); //获取A的最后一列 // 6. 对A[i1][j1]-A[i2][j2]范围内的矩阵赋值 setMatrix(int i0, int i1, int j0, int j1, Matrix X); // 举例: A为4*5的矩阵,B为4*2的矩阵 A.setMatrix(0,4,1,2,B); // 将B赋值到A的第2、3列 // ps: <5.><6.>中的i,j可以用数组表示 A.getMatrix(int[] r, int[] c); A.getMatrix(int i1, int i2, int[] c); A.getMatrix(int[] r, int j1, int j2); A.setMatrix(int[] r, int[] c, Matrix B); A.setMatrix(int i1, int i2, int[] c, Matrix B); A.setMatrix(int[] r, int j1, int j2, Matrix B);基本运算
// 1. 加 A.plus(B); //C=A+B A.plusEquals(B); //A=A+B // 2. 减 A.minus(B); //C=A-B A.minusEquals(B); //A=A-B // 3. 乘 A.times(B); //C=A*B A.times(s); //C=s*A A.timesEquals(s); //A=s*A // 4. 元素乘法 A.arrayTimes(B); //C=A.*B A.arrayTimesEquals(B);//A=A.*B // 5. 元素除法 A.arrayLeftDivide(B); //左除 C=A.B A.arrayLeftDivideEquals(B); //A=A.B A.arrayRightDivide(B); //右除 C=A./B A.arrayRightDivideEquals(); //A=A./B // 8. 转置矩阵 A.transpose();矩阵相关数学量
// 1. 条件数(2范式) (double) A.cond(); // 2. 行列式 (double) A.det(); // 3. 求秩 (int) A.rank(); // 4. 求逆/伪逆 A.inverse();线性方程求解
// 最小二乘 A.solve(B); // A*X=B A.solveTranspose(B); //A'*X'=B'矩阵分解
// Cholesky分解 A.chol(); //得到的为 CholeskyDecomposition类CholeskyDecomposition
不常用,一般都是由Matrix的方法得到
// 获取Cholesky分解结果的Matrix形式 chol.getL();写在最后
目前所使用的还只是一些基本的使用,等以后需求多了用的多了再更新吧



