java中的矩阵包
jama是一个非常好用的java的线性代数软件包。适用于日常编程可能碰到的各种矩阵运算问题,提供了一个优雅的简便的解决方案。
背景
jama是一个基本的线性代数java包,它提供了实数非稀疏矩阵类,程序员可构造操控这些类。对于经常使用到矩阵运算的码农来说,即使不精通线性代数也没有关系,因为jama包提供的功能已经够用,调用方便,使用自然,而且易于理解。Jama包意欲称为java的标准矩阵包,这一标准计划将提交给Java Grande论坛,转而交给sun公司。java矩阵类的潜在竞争对手包括Mathworks公司和国家标准化管理委员会(NIST)实现的矩阵类,我们发布这一版本,以广收评议。将来jama的新版本不一定和现在的版本兼容。
NIST和马里兰大学曾开发过一个类似的矩阵包:Jampack,这两个包的出现,出于用户对矩阵的不同实现需求。Jama基于单个矩阵类,是一个严格的面向对象的框架,而Jampack的方案更为开放,便于用户的扩展。对一般用户而言,这两个包只是在矩阵操作的语法层面上有所差别。我们希望你有时间同时了解一下这两个矩阵包,一定会受益匪浅。
功能:
jama由如下6个类组成: Matrix,CholeskyDecomposition, LUDecomposition, QRDecomposition, SingularValueDecomposition and EigenvalueDecomposition
Matrix类提供了基本的线性代数数值运算的功能,不同的构造函数可以构造双精度和浮点精度的二维数组,而不同的gets和
sets方法可以返回子矩阵和矩阵元素。基本的算术运算包括矩阵相加,矩阵相乘,矩阵范式以及基于矩阵元素的算术运算。打印矩阵的函数也包括在内。
矩阵的五大分解,涉及一对或三元组,排列向量矩阵等,对应于jama的5个矩阵分解类。这些分解类可由Matrix类访问,可以求解线性方程组,求解方阵行列式,求逆和其他矩阵运算。这些分解类如下:
- 对称正定矩阵的Cholesky分解
- 矩阵的LU分解(高斯消元)
- 矩阵的QR分解
- 对称和非对称方阵的特征向量值分解
- 矩阵的奇异值分解
目前jama只支持实数矩阵。将来可能会加入复数矩阵的支持。现在暂不实现复数矩阵,主要是由于现在还没有太多这方面的需求,故先不冒重新设计而带来的复杂风险。
Jama的设计其实是一种纯面向对象的易用性和高性能计算需求之间的折中。
对象操作 | 构造函数 set 方法 get 方法 拷贝方法 克隆方法 |
矩阵元素级别的操作 | 矩阵加法 矩阵减法 矩阵乘法 放大缩小 元素乘法 元素除法 求反 倒置 范式 |
矩阵分解 | Cholesky |
线性方程求解 | 非奇异系统 |
矩阵相关的数学量 | 条件数 |
/*
@author Jarvan Song
*/
import Jama.Matrix;
public class Test {
public static void main(String []arg)
{
double[][] array = {{1.,2.,3},{4.,5.,6.},{7.,8.,10.}};
double[][] a = {{1,1,0},{0,1,0},{0,0,1}};
//利用二维数组创建矩阵
Matrix matrix = new Matrix(a);
//打印矩阵,第一个参数是每一列的宽度,第二个参数是保留的小数点位数
matrix.print(3, 2);
//求矩阵的逆
matrix.inverse().print(3,2);
//求矩阵的转置
matrix.transpose().print(3,2);
//矩阵乘法
matrix.transpose().times(matrix).print(3,2);
//求Ax=b
Matrix A = new Matrix(array);
A.print(3, 2);
Matrix b = Matrix.random(3,1);
b.print(3, 2);
Matrix x = A.solve(b);
x.print(3, 2);
A.times(x).print(3, 2);
}
}
结果如下:
0.00 1.00 0.00
0.00 0.00 1.00
1.00 -1.00 0.00
0.00 1.00 0.00
0.00 0.00 1.00
1.00 0.00 0.00
1.00 1.00 0.00
0.00 0.00 1.00
1.00 1.00 0.00
1.00 2.00 0.00
0.00 0.00 1.00
1.00 2.00 3.00
4.00 5.00 6.00
7.00 8.00 10.00
0.78
0.19
0.29
-0.48
-0.40
0.69
0.78
0.19
0.29
不足之处:jama不是一个完整的线性代数运算库,比如我们就没有提供特征结构的矩阵类(比如带状矩阵,稀疏矩阵等),也没有实现更多的特定矩阵分解类(比如Shur,泛特征值分解等)。复数矩阵也不在其内。忽略这些实现并不是我们的本意。我们希望未来的本版中可以提供其中的一些功能(比如复数矩阵)。我们设计的宗旨是,不封死将来针对其他扩展功能的路。
最后,jama也不是一个通用的数组类,相反,它主要关注于与矩阵数值计算相关的数学运算。所以其中并没有任何关于数组的操作,比如对矩阵各个元素求sine,exp,log,或者变形矩阵之类的操作。这些操作在很多应用中很有用,在一个单独的array类中提供显然最好
jama.jar下载连接 http://download.youkuaiyun.com/detail/zybest0817/6887181