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并不适用于所有用户,但对于日常的矩阵计算,我们相信还是会迎合大部分程序员的需求。

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

时间: 2024-10-09 23:37:13

JAMA:Java矩阵包的相关文章

java jar包收集

activation~与javaMail有关的jar包,使用javaMail时应与mail.jar (mail.jar和activation.jar)一起加入到lib中去,具体负责mail的数据源和类型等. ApacheActiveMQ~Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现. ajaxtags~ajax提供的标签库,使用户能像使用jsp普通标签一样使用ajax. Apache Ant~

JDK源码简析--java.lang包中的基础类库

题记 JDK,Java Development Kit. 我们必须先认识到,JDK只是,仅仅是一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说,还是在一个层级上,它们都是需要被编译成字节码,在JRE中运行的,JDK编译后的结果就是jre/lib下得rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列所有文章基于的JDK版本都是1.7.16. 本节内容 在本节中,简析java.lang包所包

1.java.io包中定义了多个流类型来实现输入和输出功能,

1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分 类,按功能分为:(C),如果为读取的内容进行处理后再输出,需要使用下列哪种流?(G)   A.输入流和输出流 B.字节流和字符流 C.节点流和处理流   D.File stream E.Pipe stream F.Random stream G.Filter stream

java的包导入机制总结与剖析

java中有两种包的导入机制 总结如下: 1>>单类型导入(single-type-import),例如import java.io.File;   2>>按需类型导入(type-import-on-demand),例如 import java.io.*; 关于这两种导入类型大家各有所爱,众说纷纭.这里分析一下这两种导入类型的大致工作原理供大家参考. 单类型导入比较好理解,仅仅导入一个public类或者接口.而对于按需类型导入,有人误解为导入一个包下的所有类,其实不然,看名字就知道

Java io包中特殊的抽象类FilterReader和FilterWriter实践

刚才在看帮助文档的时候,发现Java io包中FilterReader和FilterWriter类没使用过,所以想实践一下. 还用以前的老方法,new一个出来,结果提示有错误: Cannot instantiate the type FilterReader 不能实例化? 一查帮助文档原来这样写道: public abstract class FilterReader extends Reader Abstract class for reading filtered character str

java中包命名常见规则

做java的都知道java的包.类.接口.枚举.方法.常量.变量等等模型都有一套约定的命名规则! 学习每一种语言都应该学习对应语法和命名规则,以保持一个良好的编码风格.一来显示自己的专业.二来方便阅读和检查,快速供其他人参考,尽快理解项目代码结构! 今天首先谈谈一些常用的java package命名规则,以后有时间再写写java其他的一些规范! 首先我们该知道的是,java的包名都是由小写单词组成的,类名的首字母都是大写,也就是我们常用的驼峰写法,包路径一般都是对系统模板的定义与归类.这样看了包

java中包容易出现的错误及权限问题

/* 3,权限在不同地方的体现: public protected default private 同一类中: ok ok ok ok 同一包中: ok ok ok 子类中: ok ok 不同包中: ok 在同一包中子类中是可以访问父类中默认权限(default)的方法,但是在不同包中不行! 在不同包中如果子类继承了父类,那么子类就可以访问父类中的protected方法! */ //import mytest.*; /* package mytest; public class DemoA{ p

转:java常用包

JAVA提供了强大的应用程序接口,既JAVA类库.他包含大量已经设计好的工具类,帮助程序员进行字符串处理.绘图.数学计算和网络应用等方面的工作.下面简单介绍JAVA核心类库中常用的组建包. 1.java.lang包 在所有的JAVA API类库中,JAVA.LANG包是最重要的,它提供了JAVA语言的核心类库,包含了运行JAVA程序必不可少的系统类,如:基本数据类型.基本数学函数.字符串处理.线程管理和异常处理类等.运行JAVA程序时,系统会自动加载JAVA.LANG包,既这个包的加载是默认的.

4.8-全栈Java笔记:包机制

包机制是java中管理类的重要手段. 开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理. 包对于类,相当于,文件夹对于文件的作用. package 我们通过package实现对类的管理,package的使用有两个要点: 1.通常是类的第一句非注释性语句. 2.包名:域名倒着写即可,再加上模块名,便于内部管理类. [示例1]package的命名举例 com.sun.test; com.oracle.test; com.bjsxt.gao.test; co