【问题标题】:C++ sparse matrix container [closed]C ++稀疏矩阵容器[关闭]
【发布时间】:2016-02-09 05:48:41
【问题描述】:

我需要一个容器来存储稀疏矩阵。矩阵的大小约为 20,000*3,000,000。但是有差距,所以实际的矩阵大概是20000*500000。并且只占用了实际矩阵的 1%。

我需要保留索引,比如二维数组。但是二维数组无法将整个数据集放入内存。我找到了具有mapped_matrixcompressed_matrixcoordinate_matrix 的 boost 库。

我想知道有什么区别?无法从their documentation 中找出答案。

还有没有其他标准库具有稀疏矩阵容器并且可以使用索引来访问?

【问题讨论】:

    标签: c++ matrix boost sparse-matrix


    【解决方案1】:

    我发现了这个:

    sparse_matrix: 这个类型是一个 std::map > 的实现。因此,插入元素需要 O(log(M)+log(K)) 操作加上存储分配,这应该是(摊销的)恒定时间。缺点是遍历所有元素、某些级别的间接(指针)和非连续存储的速度较慢。

    compressed_matrix:这种类型是从 Netlib (www.netlib.org) 中得知的压缩行存储的实现,FORTRAN 线性代数库广泛使用。简而言之:我们有一个值向量、一个对应于该值的列索引向量和一个每行开始的指针向量。如果值和列索引必须移动一个位置,则插入一个元素需要 O(log(M)+log(K)) 操作加上 O(M*K) 存储操作。通过 push_back(i,j,value) 按顺序添加元素是常数时间。增加一个存在元素只需要 O(log(M)+log(K)) 操作。优点是非常快速的元素遍历,这为线性代数例程提供了最佳性能。

    coordinate_matrix:这种类型是使用三个向量实现的三元组 (i,j,value) 列表。因此,您可以通过 insert(i,j,value) 以随机顺序插入元素,其作用类似于 A(i,j) += value。这实际上不同于其他矩阵类型的插入操作。如果您多次插入许多元素,您付出的代价是在每个元素访问和额外存储之前的 sort() 操作。 sort() 对所有元素进行排序并将一个元素的多次插入合并为一个。因此,对于 O(M*K log(MK)) 操作,元素的插入是常数时间加上最后的一次 sort(),具体取决于方法。 (根据 Stroustrup,“C++”:std::sort() 平均为 O(nlog(n)),最坏情况为 O(nn),std::stable_sort() 平均为 O( n*log(n)log(n)) 加上 O(nlog(n)) 存储。)对于这种类型的线性代数运算通常比压缩矩阵慢。

    参考:http://www.guwi17.de/ublas/matrix_sparse_usage.html

    如果您在阅读他们的文档时遇到同样的问题,希望这会对您有所帮助。

    【讨论】:

      【解决方案2】:

      查看overview page of uBLAS。它们描述了稀疏向量和矩阵使用的存储空间。

      【讨论】:

        【解决方案3】:

        看看 1.(特征)http://eigen.tuxfamily.org/ 2.(乌布拉斯)http://www.boost.org/doc/libs/1_60_0/libs/numeric/ublas/doc/types_overview.html 3.(MTL4)

        根据您的要求使用其中任何一种,可能会通过 ublas 他们描述那里的稀疏向量和矩阵使用的存储。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-18
          • 1970-01-01
          • 2018-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-05
          • 2018-06-04
          相关资源
          最近更新 更多