【问题标题】:std::vector<std::vector<type>> for sparse matrix structure or something else?std::vector<std::vector<type>> 用于稀疏矩阵结构还是其他?
【发布时间】:2010-07-23 15:25:21
【问题描述】:

我正在以压缩行格式实现稀疏矩阵类。这意味着我有固定数量的行,每行由许多元素组成(这个数字对于不同的行可能不同,但在矩阵初始化后不会改变。

是否适合通过向量的向量来实现这一点,还是会以某种方式分割内存?

我应该如何实现这个分配,所以我将拥有一大块内存?

感谢您分享您的智慧! 德克

【问题讨论】:

    标签: c++ memory-management sparse-matrix


    【解决方案1】:

    您可以使用现有的库,例如 boost 稀疏矩阵 (http://www.boost.org/doc/libs/1_43_0/libs/numeric/ublas/doc/matrix_sparse.htm)

    【讨论】:

      【解决方案2】:

      稀疏矩阵的一般规则是选择最适合矩阵中非零位置的结构;所以也许你可以写更多关于矩阵结构的内容,以及将在其上调用什么(某种)算法。
      关于内存——如果这个矩阵不是太大,最好把它分配成一大块,让索引变魔术;这可能会导致更好的缓存使用。 如果它很大,那么应该使用分块版本,因为它更适合内存。

      【讨论】:

        【解决方案3】:

        你不会用向量的向量得到“一大块”。每一行都是一个连续的块,但每一行的数据可能位于堆上的不同位置。

        请记住,如果您要处理巨大的矩阵,这可能是一件好事。矩阵越大,您获得适合整个事物的连续块的可能性就越小。

        【讨论】:

          【解决方案4】:

          我已经使用 3 个std::vector&lt;int&gt; 实现了压缩列格式(2 个用于行和列索引,一个用于值)。为什么需要std::vector&lt;std::vector&lt;int&gt;&gt;

          您确定您正在实施正确的格式吗?压缩列格式的描述(以及矩阵向量乘法的代码)can be found here.

          【讨论】:

          • 刚刚意识到我没有以压缩行格式存储我的矩阵,而是以 LoL (en.wikipedia.org/wiki/Sparse_matrix#List_of_lists_.28LIL.29)
          • 你只打算做矩阵向量乘法吗?如果是这样,我会推荐压缩列格式。乘法很容易实现!
          • 是的,主要是,谢谢,我想我会这样做。乘法的并行化也应该很容易实现(因为存储了每一行的偏移量),我猜
          • 是的,并行化是微不足道的(在我链接到的那个 PDF 的代码中)。唯一的问题是转换为该格式。目前,我将矩阵存储为三元组格式,然后将其转换为 CCS。
          猜你喜欢
          • 2012-03-07
          • 1970-01-01
          • 2017-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多