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类访问,可以求解线性方程组,求解方阵行列式,求逆和其他矩阵运算。这些分解类如下:
目前jama只支持实数矩阵。将来可能会加入复数矩阵的支持。现在暂不实现复数矩阵,主要是由于现在还没有太多这方面的需求,故先不冒重新设计而带来的复杂风险。
Jama的设计其实是一种纯面向对象的易用性和高性能计算需求之间的折中。
对象操作 |
构造函数 set 方法 get 方法 拷贝方法 克隆方法 |
矩阵元素级别的操作 | 矩阵加法 矩阵减法 矩阵乘法 放大缩小 元素乘法 元素除法 求反 倒置 范式 |
矩阵分解 | Cholesky |
线性方程求解 | 非奇异系统 |
矩阵相关的数学量 |
条件数 |
使用范例 下面的例子求解了一个线性方程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类中提供显然最好。
我们计划把jama做成java的标准库,这一标准化将给java增加数值计算模块,带来更好的可移植性和性能,我们乐意听到大家的任何反馈。 当然我们也自知jama并不适用于所有用户,但对于日常的矩阵计算,我们相信还是会迎合大部分程序员的需求。
讨论组. 用户可在已经建立的讨论组中评论.评论和建议可以发送至[email protected],它们将自动转发给jama的作者们,以及其他邮件订阅者。 如果你想订阅邮件,请发邮件到[email protected] ,包含文本为 subscribe jama your-name .订阅邮件列表可在此阅览:archive of the discussion.