Java矩阵库Jama_java jama
Jama是一个非常好用的Java的线性代数软件包。适用于日常编程可能碰到的各种矩阵运算问题,提供了一个优雅的简便的解决方案。
- 官网链接:JAMA: Java Matrix Package (nist.gov)
原本只是搬砖式的项目工程到后半部分就卡壳了,没有合适的算法来支撑,在经过各种脑洞和论文后,最后还是老老实实的捡回线性代数,尝试着一步步去推导。
Maven引入
<dependency> <groupId>gov.nist.math</groupId> <artifactId>jama</artifactId> <version>1.0.3</version></dependency>
功能
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: 中的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+BA.plusEquals(B); //A=A+B// 2. 减A.minus(B);//C=A-BA.minusEquals(B);//A=A-B// 3. 乘A.times(B);//C=A*BA.times(s);//C=s*AA.timesEquals(s);//A=s*A// 4. 元素乘法A.arrayTimes(B);//C=A.*BA.arrayTimesEquals(B);//A=A.*B// 5. 元素除法A.arrayLeftDivide(B);//左除 C=A.\\BA.arrayLeftDivideEquals(B);//A=A.\\BA.arrayRightDivide(B);//右除 C=A./BA.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=BA.solveTranspose(B);//A\'*X\'=B\'
矩阵分解
// Cholesky分解A.chol();//得到的为 CholeskyDecomposition类
CholeskyDecomposition
不常用,一般都是由Matrix的方法得到
// 获取Cholesky分解结果的Matrix形式chol.getL();
写在最后
目前所使用的还只是一些基本的使用,等以后需求多了用的多了再更新吧