JAMA:Java矩阵包

原文链接:JAMA:Java矩阵包

API文档链接:线性代数Java包 JAMA

jama是一个非常好用的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的设计其实是一种纯面向对象的易用性和高性能计算需求之间的折中。

 

JAMA功能汇总

对象操作

构造函数  
set 方法  
get 方法 
拷贝方法
克隆方法
矩阵元素级别的操作 矩阵加法
矩阵减法
矩阵乘法
放大缩小
元素乘法  
元素除法
求反
倒置  
范式
矩阵分解

Cholesky  
LU  
QR  
SVD  
对称矩阵的特征值
非对称矩阵的特征值

线性方程求解

非奇异系统
最小二乘

矩阵相关的数学量

条件数  
行列式
矩阵秩  
求逆
伪逆

 

使用范例 下面的例子求解了一个线性方程Ax = b,矩阵规模为 3 * 3,最后算出了残差的范式。

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

参考实现. 

本网站下载的jama实现只能作为参考实现。它本质上还是一个教学性质的软件包。其中的算法类于于Wilkinson和Reinsch的手册中的内容,比如在EISPACK,LINPACK和MATLAB中使用的算法。Matrices类的内部数据存储为java的基本数组类型(比如,double[][]),代码可读性强,易于理解。虽然对于中小型的数据规模,我们的程序足够快速,但我们还是非常希望软件商和java虚拟机能够针对特征环境做一些优化。

未涵盖的内容

jama不是一个完整的线性代数运算库,比如我们就没有提供特征结构的矩阵类(比如带状矩阵,稀疏矩阵等),也没有实现更多的特定矩阵分解类(比如Shur,泛特征值分解等)。复数矩阵也不在其内。忽略这些实现并不是我们的本意。我们希望未来的本版中可以提供其中的一些功能(比如复数矩阵)。我们设计的宗旨是,不封死将来针对其他扩展功能的路。

最后,jama也不是一个通用的数组类,相反,它主要关注于与矩阵数值计算相关的数学运算。所以其中并没有任何关于数组的操作,比如对矩阵各个元素求sine,exp,log,或者变形矩阵之类的操作。这些操作在很多应用中很有用,在一个单独的array类中提供显然最好。

矩阵包1.0.2版

早期保本


 

我们计划把jama做成java的标准库,这一标准化将给java增加数值计算模块,带来更好的可移植性和性能,我们乐意听到大家的任何反馈。 当然我们也自知jama并不适用于所有用户,但对于日常的矩阵计算,我们相信还是会迎合大部分程序员的需求。

讨论组. 用户可在已经建立的讨论组中评论.评论和建议可以发送至jama@nist.gov,它们将自动转发给jama的作者们,以及其他邮件订阅者。 如果你想订阅邮件,请发邮件到listproc@nist.gov ,包含文本为 subscribe jama your-name .订阅邮件列表可在此阅览:archive of the discussion.

posted @ 2015-07-06 10:17  ~风轻云淡~  阅读(3510)  评论(0编辑  收藏  举报