Jama是一个非常好用的Java的线性代数软件包。适用于日常编程可能碰到的各种矩阵运算问题,提供了一个优雅的简便的解决方案。
原本只是搬砖式的项目工程到后半部分就卡壳了,没有合适的算法来支撑,在经过各种脑洞和论文后,最后还是老老实实的捡回线性代数,尝试着一步步去推导。
<!-- https://mvnrepository.com/artifact/gov.nist.math/jama -->
<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的五个矩阵分解类,依次为:
CholeskyDecomposition
LUDecomposition
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();
// 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类
不常用,一般都是由Matrix的方法得到
// 获取Cholesky分解结果的Matrix形式
chol.getL();
目前所使用的还只是一些基本的使用,等以后需求多了用的多了再更新吧