首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost中compressed_matrix分配的空间

boost中compressed_matrix分配的空间
EN

Stack Overflow用户
提问于 2010-09-21 03:37:28
回答 3查看 577关注 0票数 0

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

代码语言:javascript
复制
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中我可以使用什么数据结构来仅为非零元素分配空间。其次,如何设置非零元素的值?

非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2010-09-21 03:56:24

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-26 18:42:32

CRS格式

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

代码语言:javascript
复制
+---+---+---+---+
| A | 0 | B | 0 |
+---+---+---+---+
| 0 | C | 0 | 0 |
+---+---+---+---+
| 0 | 0 | D | E |
+---+---+---+---+

如果您存储每行的非零数、列索引和每个非零项的值,则可以非常有效地以压缩行存储格式(ublas::compressed_matrix的默认格式)存储它:

代码语言:javascript
复制
                     +---+---+---+
number of non-zeros  | 2 | 1 | 2 |
                     +---+---+---+
                     +---+---+---+---+---+
column index         | 0 | 2 | 1 | 2 | 3 |
                     +---+---+---+---+---+
                     +---+---+---+---+---+
value                | A | B | C | D | E |
                     +---+---+---+---+---+

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

内存要求

CRS格式所需的内存大致为

代码语言:javascript
复制
memoryRequired = numberOfRows * sizeof(index_type) 
                 + NNZ * sizeof(index_type) 
                 + NNZ * sizeof(value_type)

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

对于您的示例

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

代码语言:javascript
复制
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的内存了。如果你还想存储一些向量,那么在传统的台式机上你很快就会耗尽内存。

票数 1
EN

Stack Overflow用户

发布于 2010-09-21 03:42:10

3*m = 300000000

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3754871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档