la4j - Java 线性代数





0/5 (0投票)
优雅纯粹的 Java 矩阵库
引言
la4j 是一个开源、单线程且 100% Java 库,用于解决线性代数问题。它支持稀疏和稠密矩阵,涵盖了几乎所有的线性代数任务。
la4j 是作者在俄罗斯一所大学学习计算数学的过程中编写的。
特点
以下是当前版本 la4j 的特性:
- 向量和矩阵的统一解释
- 稀疏 (CSR) 和稠密 (2d 数组) 矩阵和向量支持
- 基本的向量和矩阵运算(加法、乘法、转置等)
- 线性系统求解 (高斯消元法, 雅可比法, 高斯-赛德尔法 等)
- 矩阵分解 (SVD, LU, 乔莱斯基分解 等)
- 逆矩阵求解基础
- 矩阵和向量的序列化
- 向量和矩阵的 I/O 支持 (MatrixMarket 格式)
此外,la4j 现在包含 55 个类,6700 行代码,90 个测试用例,50 kb (jar 包大小)。
矩阵和向量
请参阅下方的 la4j 核心类图

la4j 通过工厂 - DenseFactory
和 SparseFactory
提供了一个灵活的 API,用于处理矩阵和向量。这是一个例子:
Factory denseFactory = new DenseFactory();
Factory sparseFactory = new SparseFactory();
double array[][] = new double[][] {
{1.0, 0.0, 0.0},
{0.0, 5.0, 0.0},
{0.0, 0.0, 9.0}
};
Matrix a = sparseFactory.createMatrix(array);
Matrix b = denseFactory.createMatrix(array);
Matrix c = a.copy(denseFactory); // convert sparse to dense
Matrix d = b.copy(sparseFactory); // convert dense to sparse
这是一个基本运算的例子:
Matrix a = sparseFactory.createMatrix(array);
Matrix b = denseFactory.createMatrix(array);
Matrix c = a.multiply(b); // c - is sparse matrix
Matrix d = a.multiply(b, denseFactory); // d - is dense matrix
Matrix e = c.add(d).subtract(a).multiply(100); // c + d - a * 100
Matrix f = a.transpose(); // f - is sparse matrix
Matrix g = a.transpose(denseFactory); // g - is dense matrix
线性系统
la4j 支持大多数流行的求解线性系统的方法。请参阅下方 la4j.linear
包的设计:

如您所见,la4j.linear
包实现了 策略设计模式。
这是一个在 la4j 中求解线性系统的例子:
Matrix a = denseFactory.createMatrix(array);
Vector b = sparseFactory.createVector(array[0]);
LinearSystem system = new LinearSystem(a, b);
Vector x = system.solve(new GaussianSolver()); // x - is dense vector
Vector y = system.solve(new JacobiSolver(), sparseFactory); // y - is sparse vector
矩阵分解
la4j.decomposition
包中提供了许多矩阵分解方法。

该包是基于 策略设计模式 实现的。
这是一个如何使用 la4j 进行矩阵分解的例子:
Matrix a = denseFactory.createMatrix(array);
Matrix[] qr = a.decompose(new QRDecompositor()); // qr[0] = Q, qr[1] = R;
// Q,R - dense matrices
Matrix[] lu = a.decompose(new LUDecompositor(), sparseFactory); // lu[0] = L, lu[1] = U;
// L,U - sparse matrices
输入/输出
la4j 通过 la4j.io
包支持 I/O 操作。它实现了 桥接设计模式。
当前实现支持 MatrixMarket 格式。这是一个矩阵输出的例子:
0 1 0
0 2 0
0 3 0
对于稠密矩阵,将会是:
%%MatrixMarket matrix array real general
3 3
0
1
0
0
2
0
0
3
0
对于稀疏矩阵,将会是:
%%MatrixMarket matrix coordinate real general
3 3 3
0 1 1
1 1 2
2 1 3
la4j 提供了两个类:MMInputStream
和 MMInputStream
,它们可以在序列化算法中代替 ObjectInputStream
和 ObjectOutputStream
。例如:
Matrix a = denseFactory.createMatrix(array);
ObjectOutput mmos = new MMOutputStream(new FileOutputStream("file.mm"));
mmos.writeObject(a);
mmos.close();
ObjectInput mmis = new MMInputStream(new FileInputStream("file.mm"));
Matrix b = (Matrix) mmis.readObject();
mis.close();
链接
您可以在 Google Code 上找到 la4j 项目。您还可以访问 la4j 开发博客 Blogger。
历史
- 2011 年 11 月 14 日:初始发布