我需要一个容器来存储稀疏矩阵。矩阵的大小约为20,000 * 3,000,000。但是存在差距,因此实际矩阵大约为20,000 * 500,000。并且只有1%的实际矩阵被占用。
我需要保留索引,比如2D数组。但是2D数组无法将整个数据集放入内存中。我找到了包含mapped_matrix
,compressed_matrix
,coordinate_matrix
的推文库。
我想知道有什么区别?无法从their documentation中找到答案。
还有其他标准库有稀疏矩阵容器,可以使用索引访问吗?
答案 0 :(得分:1)
我发现了这个:
sparse_matrix
:此类型是std :: map>的实现。因此,元素的插入需要O(log(M)+ log(K))操作加上存储分配,这应该是(摊销的)连续时间。缺点是遍历所有元素,某些间接(指针)级别和不连续存储的遍历速度较慢。
compressed_matrix
:此类型是从FORTRAN线性代数库广泛使用的Netlib(www.netlib.org)中获知的压缩行存储的实现。简短:我们有一个值向量,一个对应于此值的列索引向量和一个每行开始的指针向量。如果必须将值和列索引移动一个位置,则插入一个元素需要O(log(M)+ log(K))操作加O(M * K)存储操作。按push_back(i,j,value)顺序添加元素是常量时间。增加existend元素只需要O(log(M)+ log(K))操作。优点是非常快速的元素遍历,为线性代数例程提供了最佳性能。
coordinate_matrix
:此类型是通过使用三个向量实现三元组列表(i,j,value)。因此,您可以通过insert(i,j,value)以随机顺序插入元素,其行为类似于A(i,j)+ = value。这实际上不同于其他矩阵类型的插入操作。您支付的价格是每个元素访问前的sort()操作和多次插入多个元素的额外存储。 sort()对所有元素进行排序,并将元素的多个插入组合为一个元素。因此,对于O(M * K log(M K))操作,元素的插入是恒定时间加上一个sort(),这取决于方法。 (根据Stroustrup," C ++":std :: sort()的平均值为O(n log(n)),最差情况为O(n n),std :: stable_sort()具有O(n * log(n) log(n))加上O(n log(n))存储。)对于这种类型,线性代数运算通常比compress_matrix慢
参考:http://www.guwi17.de/ublas/matrix_sparse_usage.html
希望如果您在阅读文档时遇到同样的问题,这将对您有所帮助。
答案 1 :(得分:0)
查看overview page of uBLAS。它们描述了那里稀疏向量和矩阵使用的存储。
答案 2 :(得分:0)
看看 1.(本征)http://eigen.tuxfamily.org/ 2.(uBLAS库)http://www.boost.org/doc/libs/1_60_0/libs/numeric/ublas/doc/types_overview.html 3.(MTL4)
取决于您的要求使用其中任何一个,可能通过 ublas 他们描述那里稀疏向量和矩阵使用的存储。