CRS 格式
首先是压缩格式的一分钟介绍。给定矩阵
+---+---+---+---+
| A | 0 | B | 0 |
+---+---+---+---+
| 0 | C | 0 | 0 |
+---+---+---+---+
| 0 | 0 | D | E |
+---+---+---+---+
ublas::compressed_matrix
如果存储每行的非零数、列索引和每个非零条目的值,则可以非常有效地以压缩行存储 (CRS) 格式(这是 的默认格式)存储它:
+---+---+---+
number of non-zeros | 2 | 1 | 2 |
+---+---+---+
+---+---+---+---+---+
column index | 0 | 2 | 1 | 2 | 3 |
+---+---+---+---+---+
+---+---+---+---+---+
value | A | B | C | D | E |
+---+---+---+---+---+
注意:有不同的变体,例如,除了非零数 (NNZ) 的数量,您还可以为每一行存储指向其在column index
和value
向量中的第一个元素的索引。或者,您可以将指向这些值的指针存储在新行开始的位置等等。但是,它们都需要或多或少相同数量的内存。
内存要求
CRS格式所需的内存大致为
memoryRequired = numberOfRows * sizeof(index_type)
+ NNZ * sizeof(index_type)
+ NNZ * sizeof(value_type)
加上一些开销来存储数组的长度、指向数据的指针等等。但是,与数据本身所需的内存相比,并且考虑到压缩矩阵往往非常大(否则无论如何您都可以使用密集矩阵),这种开销通常可以忽略不计。
对于你的例子
您正在尝试分配一个具有m
行、m
列和3*m
非零条目的 CRS 矩阵,m
其中10^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 的内存。如果您还想存储一些向量,那么您很快就会在传统台式机上内存不足。