我正在寻找一个C / C ++接口,用于在Linux中高效计算庞大的稀疏矩阵。矩阵可能是数百万/数千万。我检查了一些现有的库,但似乎没有一个满足我的所有要求,
1,我需要通过动态添加元素来创建稀疏矩阵。 (不适用于SparseLib ++)
2,我还需要能够创建稀疏对角矩阵,以便我可以使用不同的标量缩放另一个稀疏矩阵的列。 (没有为此找到一个库,也许还有另一种按列缩放稀疏矩阵的方法)
3,它需要支持矩阵乘法运算矩阵/向量(许多库支持这些基本操作)
4,它需要支持两个稀疏矩阵或向量之间的入口乘法或除法,如MATLAB中的。*或./(没有为此找到一个库,我需要这个操作来筛选出一些条目一个稀疏矩阵与另一个稀疏矩阵)
5,矩阵求逆或线性求解器。 (大多数库提供线性系统的求解器)
我最初在Python中使用scipy来实现我的算法。 Python消耗太多内存并且速度很慢,这就是我想将程序转换为C的原因。
感谢。
答案 0 :(得分:2)
我会推荐Tim Davis的CSparse。
答案 1 :(得分:1)
我很高兴使用英特尔MKL。
答案 2 :(得分:1)
唉,大多数稀疏矩阵库使用的格式很难动态设置元素(google for Compressed Sparse Row,这是最常见的格式)。
正如您所说,大多数图书馆为您提供所有要求,但#1除外。对于#2,一旦理解了存储格式,通常很容易。
英特尔MKL提供的PARDISO解算器不会强加格式,它只需要您能够执行矩阵/矢量产品:您在循环中调用求解器,从中获取返回码,然后执行它要求你做(乘以A,检查终止条件,预处理,......)。这样,您可以使用您需要的任何存储方案。当你不想存储矩阵或者你有一个时髦的存储格式时,这很有用。
您的要求(特别是#1)是quadtree based sparse matrices的绝佳候选人。但是,我不知道这有什么好的实施。如果你设法编码/找到它的实现,我将不胜感激。
答案 3 :(得分:1)
你看过LinBox了吗?它支持多种稀疏矩阵存储格式,其中一些允许您在创建矩阵后设置条目:
// set m[i,j] to a
m.refEntry(i, j) = a;
我不确定您的要求4.是否满足开箱即用,但使用refEntry
方法可以轻松编码。
答案 4 :(得分:0)
我个人尝试过TAUCS,用于解决使用它的图像处理中数百万x万的稀疏矩阵的项目,这样就可以指示它可以处理的大小。
我同意Alexandre的看法,这些软件包有自己的“格式”,用于编码稀疏矩阵,但这是不可避免的,因为你必须告诉求解器非零元素的位置。但从好的方面来看,他们并不难学。顺便说一句,TAUCS使用压缩列存储(CCS)格式。 Alexandre所指的可能是压缩行存储(CRS)。我认为有一种更流行的格式,它使用矩阵中元素的(i,j)“位置”明确地编码元素值,但就此而言。
有关这些套餐的详细信息,请参阅www.matrixprogramming.com。