【问题标题】:space allocated by compressed_matrix in boost在 boost 中由compressed_matrix 分配的空间
【发布时间】:2010-09-20 19:37:27
【问题描述】:

boostcompressed_matrix 分配了多少空间?它只为非零元素分配空间是真的吗?如果这是真的,我不明白为什么下面的代码会给出 bad_alloc 错误。

namespace bubla = boost::numeric::ublas; 
typedef double value_type; 
typedef bubla::compressed_matrix<value_type> SparseMatrix; 
unsigned int m = 10000*10000; 
SparseMatrix D(m,m,3*m), X; 

它应该只为 3*m=3*10000*10000 个元素分配空间,对吗?

你能帮忙澄清一下吗?我可以使用什么数据结构来只为非零元素分配空间。其次,如何为非零元素设置值?

非常感谢。

【问题讨论】:

    标签: c++ boost sparse-matrix


    【解决方案1】:

    请注意,您在上面的示例中将 m 定义为 10000*10000,这意味着您正在尝试分配 3 亿个双精度或 2.4 GB(假设每个双精度 8 个字节)。

    如果您只想要一个稀疏的 10000 x 10000 矩阵,只需定义“m=10000”即可。

    【讨论】:

    • 是的,这是正确的.. 它是一个 N^2 x N^2 矩阵,其中 m=N^2。当 N 变得这么大时,我无法分配一个完整的矩阵。但我应该能够分配稀疏矩阵以节省空间。对于稀疏矩阵,空间要求是 3*N^2,应该是可以管理的。
    【解决方案2】:

    CRS 格式

    首先是对压缩格式的一分钟介绍。给定矩阵

    +---+---+---+---+
    | A | 0 | B | 0 |
    +---+---+---+---+
    | 0 | C | 0 | 0 |
    +---+---+---+---+
    | 0 | 0 | D | E |
    +---+---+---+---+
    

    您可以以压缩行存储 (CRS) 格式(即 ublas::compressed_matrix 的默认格式),如果存储每行非零的数量、列索引和每个非零条目的值:

                         +---+---+---+
    number of non-zeros  | 2 | 1 | 2 |
                         +---+---+---+
                         +---+---+---+---+---+
    column index         | 0 | 2 | 1 | 2 | 3 |
                         +---+---+---+---+---+
                         +---+---+---+---+---+
    value                | A | B | C | D | E |
                         +---+---+---+---+---+
    

    注意:有不同的变体,例如除了非零的数量(NNZ),您还可以为每一行存储column indexvalue 向量中其第一个元素的索引。或者,您可以将指向这些值的指针存储在新行开始的位置等等。但是,它们都需要或多或少相同数量的内存。

    内存要求

    CRS格式需要的内存大概是

    memoryRequired = numberOfRows * sizeof(index_type) 
                     + NNZ * sizeof(index_type) 
                     + NNZ * sizeof(value_type)
    

    加上一些开销来存储数组的长度、指向数据的指针等等。但是,与数据本身所需的内存相比,并且考虑到压缩矩阵往往非常大(否则无论如何您都可以使用密集矩阵),这种开销通常可以忽略不计。

    举个例子

    您正在尝试分配具有m 行、m 列和3*m 非零条目的CRS 矩阵,其中m10^8。这将需要以下内存量,假设您使用 uint32 作为索引类型和 double 作为条目类型:

    NNZ vector              m * 4 =  381.5 MB
    column index vector   3*m * 4 = 1144.4 MB
    value vector          3*m * 8 = 2288.8 MB
    -----------------------------------------
    total                           3814.7 MB
    

    所以您的矩阵已经需要大约 4 GB 的内存。如果您还想存储一些向量,那么您很快就会在传统台式机上内存不足。

    【讨论】:

      【解决方案3】:

      3*m = 300000000

      【讨论】:

      • 不计算内部数据结构以维护非空列表中的实际矩阵。
      • 我意识到即使有 3*m 的空间,它仍然超出了我的限制。感谢您的确认。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2011-07-06
      • 2014-04-18
      • 2013-04-06
      • 2016-10-20
      相关资源
      最近更新 更多