当前位置: 首页 > 工具软件 > JAMA > 使用案例 >

Java矩阵库Jama

丁振海
2023-12-01

Jama是一个非常好用的Java的线性代数软件包。适用于日常编程可能碰到的各种矩阵运算问题,提供了一个优雅的简便的解决方案。

原本只是搬砖式的项目工程到后半部分就卡壳了,没有合适的算法来支撑,在经过各种脑洞和论文后,最后还是老老实实的捡回线性代数,尝试着一步步去推导。

Maven引入

<!-- 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, SingularValueDecompositionEigenvalueDecomposition

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(); 

写在最后

目前所使用的还只是一些基本的使用,等以后需求多了用的多了再更新吧

 类似资料: