boost compressed_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元素分配空间,对吗?
你能帮我澄清一下吗?在boost中我可以使用什么数据结构来仅为非零元素分配空间。其次,如何设置非零元素的值?
非常感谢。
发布于 2010-09-21 03:56:24
请注意,在上面的示例中,您将m定义为10000*10000,这意味着您正在尝试分配3亿双精度或2.4 GB (假设每个双精度8字节)。
如果您只想要一个稀疏的10000 x 10000矩阵,只需定义"m=10000“即可。
发布于 2012-07-26 18:42:32
CRS格式
首先,对压缩格式进行一分钟的介绍。给定矩阵
+---+---+---+---+
| A | 0 | B | 0 |
+---+---+---+---+
| 0 | C | 0 | 0 |
+---+---+---+---+
| 0 | 0 | D | E |
+---+---+---+---+如果您存储每行的非零数、列索引和每个非零项的值,则可以非常有效地以压缩行存储格式(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 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的内存了。如果你还想存储一些向量,那么在传统的台式机上你很快就会耗尽内存。
发布于 2010-09-21 03:42:10
3*m = 300000000
https://stackoverflow.com/questions/3754871
复制相似问题