【发布时间】:2010-07-23 15:25:21
【问题描述】:
我正在以压缩行格式实现稀疏矩阵类。这意味着我有固定数量的行,每行由许多元素组成(这个数字对于不同的行可能不同,但在矩阵初始化后不会改变。
是否适合通过向量的向量来实现这一点,还是会以某种方式分割内存?
我应该如何实现这个分配,所以我将拥有一大块内存?
感谢您分享您的智慧! 德克
【问题讨论】:
标签: c++ memory-management sparse-matrix
我正在以压缩行格式实现稀疏矩阵类。这意味着我有固定数量的行,每行由许多元素组成(这个数字对于不同的行可能不同,但在矩阵初始化后不会改变。
是否适合通过向量的向量来实现这一点,还是会以某种方式分割内存?
我应该如何实现这个分配,所以我将拥有一大块内存?
感谢您分享您的智慧! 德克
【问题讨论】:
标签: c++ memory-management sparse-matrix
您可以使用现有的库,例如 boost 稀疏矩阵 (http://www.boost.org/doc/libs/1_43_0/libs/numeric/ublas/doc/matrix_sparse.htm)
【讨论】:
稀疏矩阵的一般规则是选择最适合矩阵中非零位置的结构;所以也许你可以写更多关于矩阵结构的内容,以及将在其上调用什么(某种)算法。
关于内存——如果这个矩阵不是太大,最好把它分配成一大块,让索引变魔术;这可能会导致更好的缓存使用。
如果它很大,那么应该使用分块版本,因为它更适合内存。
【讨论】:
你不会用向量的向量得到“一大块”。每一行都是一个连续的块,但每一行的数据可能位于堆上的不同位置。
请记住,如果您要处理巨大的矩阵,这可能是一件好事。矩阵越大,您获得适合整个事物的连续块的可能性就越小。
【讨论】:
我已经使用 3 个std::vector<int> 实现了压缩列格式(2 个用于行和列索引,一个用于值)。为什么需要std::vector<std::vector<int>>?
您确定您正在实施正确的格式吗?压缩列格式的描述(以及矩阵向量乘法的代码)can be found here.
【讨论】: