65.9K
CodeProject 正在变化。 阅读更多。
Home

la4j - Java 线性代数

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011年11月14日

CPOL

2分钟阅读

viewsIcon

31489

downloadIcon

383

优雅纯粹的 Java 矩阵库

引言

la4j 是一个开源、单线程且 100% Java 库,用于解决线性代数问题。它支持稀疏和稠密矩阵,涵盖了几乎所有的线性代数任务。

la4j 是作者在俄罗斯一所大学学习计算数学的过程中编写的。

特点

以下是当前版本 la4j 的特性:

此外,la4j 现在包含 55 个类,6700 行代码,90 个测试用例,50 kb (jar 包大小)。

矩阵和向量

请参阅下方的 la4j 核心类图

la4j 通过工厂 - DenseFactorySparseFactory 提供了一个灵活的 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 提供了两个类:MMInputStreamMMInputStream,它们可以在序列化算法中代替 ObjectInputStreamObjectOutputStream。例如:

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 日:初始发布
© . All rights reserved.