寻找一个C / C ++接口,用于在Linux中高效计算庞大的稀疏矩阵

我正在寻找一个C / C ++接口,用于在Linux中高效计算庞大的稀疏矩阵。 矩阵可能是数百万/数千万。 我检查了一些现有的库,但似乎没有一个满足我的所有要求,

1,我需要通过动态添加元素来创建稀疏矩阵。 (不适用于SparseLib ++)

2,我还需要能够创建稀疏对角矩阵,以便我可以使用不同的标量缩放另一个稀疏矩阵的列。 (没有为此找到一个库,也许还有另一种方法可以按列缩放稀疏矩阵)

3,需要支持矩阵运算与矩阵/向量相乘(许多库支持这些基本运算)

4,它需要支持两个稀疏矩阵或向量之间的入口乘法或除法,如MATLAB中的。*或./(没有为此找到一个库,我需要这个操作来筛选一个稀疏的一些条目矩阵与另一个稀疏矩阵)

5,矩阵求逆或线性求解器。 (大多数库提供线性系统的求解器)

我最初在Python中使用scipy来实现我的算法。 Python消耗太多内存而且速度很慢,这就是我想将程序转换为C的原因。

谢谢。

我会推荐蒂姆戴维斯的CSparse。

我很高兴使用英特尔的MKL 。

唉,大多数稀疏矩阵库使用的格式很难动态设置元素(google for Compressed Sparse Row,这是最常见的格式)。

正如您所说,大多数图书馆为您提供所有要求,但#1除外。 对于#2,一旦理解了存储格式,通常很容易。

英特尔MKL提供的PARDISO解算器不会强制使用格式,它只需要您能够执行矩阵/矢量产品:您在循环中调用求解器,从中获取返回代码,并执行它要求您执行的操作do(乘以A,检查终止条件,预处理,……)。 这样,您可以使用您需要的任何存储方案。 当您不想存储矩阵或者如果您有一个时髦的存储格式时,它很有用。

您的要求(尤其是#1)是基于四叉树的稀疏矩阵的理想选择。 但是,我不知道这有什么好的实施。 如果您设法对其进行编码/找到它的实现,我将不胜感激。

你看过LinBox了吗? 它支持多种稀疏矩阵存储格式,其中一些允许您在创建矩阵后设置条目:

// set m[i,j] to a m.refEntry(i, j) = a; 

我不确定您的要求4.是否满足开箱即用,但使用refEntry方法可以轻松编码。

尝试TAUCS或MUMPS 。

我个人尝试使用TAUCS来解决使用它来处理图像处理数百万x万的稀疏矩阵的项目,这样就可以指示它可以处理的大小。

我同意Alexandre的看法,这些软件包有自己的“格式”,用于编码稀疏矩阵,但这是不可避免的,因为你必须告诉求解器非零元素的位置。 但从好的方面来看,他们并不难学。 顺便说一句,TAUCS使用压缩列存储(CCS)格式。 Alexandre所指的可能是压缩行存储(CRS)。 我认为有一种更流行的格式,它使用矩阵中元素的(i,j)“位置”明确地编码元素值,但这是关于它的。

有关这些软件包的详细信息,请访问www.matrixprogramming.com 。