C++稀疏矩阵容器

C++ sparse matrix container

本文关键字:C++      更新时间:2023-10-16

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

我需要保留索引,类似于 2D 数组。但是 2D 数组无法将整个数据集放入内存中。我找到了有mapped_matrixcompressed_matrixcoordinate_matrix的提升库。

我想知道有什么区别?无法从他们的文档中找出来。

是否有任何其他标准库具有稀疏矩阵容器并且可以使用索引进行访问?

我找到了这个:

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,值(的列表。因此,您可以通过插入(i,j,值(以随机顺序插入元素,其作用类似于A(i,j(+=值。这实际上不同于其他矩阵类型的插入操作。您支付的价格是每个元素访问之前的 sort(( 操作,如果您多次插入许多元素,则额外存储。sort(( 对所有元素进行排序,并将一个元素的多次插入合并为一个。因此,根据方法的不同,元素的插入是常量时间加上一个 sort(( 在 O(M*K log(MK(( 操作结束时。(根据Stroustrup的说法,"C++":std::sort((具有平均O(n log(n((,最坏情况O(n n(,std::stable_sort((具有O(n*log(n(log(n((加上O(n log(n((存储。对于这种类型的线性代数运算通常比compressed_matrix慢。

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

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

查看uBLAS的概述页面。它们描述了稀疏向量和矩阵使用的存储。

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

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

相关文章:
  • 没有找到相关文章