【问题标题】:Algorithm for quadratic form matrix multiplication with sparse matrix稀疏矩阵的二次型矩阵乘法算法
【发布时间】:2011-12-15 08:31:10
【问题描述】:

我正在优化严重依赖于定制矩阵库的代码(它不会被排除在项目之外,因为它无处不在。这不好,但这是事实......)许多计算都是用10-20 行和列的矩阵,许多计算包括二次形式,如

C = A*B*A'

我意识到 A 通常是稀疏的,我想利用这个事实。所以我正在寻找一种可以处理这种情况的算法。数值稳定性很重要。有什么我可以用的吗? (我没有编写我们的库,所以我不知道是否有任何我应该考虑的陷阱?)

由于“我们的”简单 O(n³) 乘法方法在目标平台上的执行速度比 Eigen 3 快,因为我需要数值稳定性并且矩阵不是很大,我猜 Strassen 算法以及 Coppersmith–Winograd 算法不是我要找的。相反,它只是二次形式的乘法,可以让我轻松检查 A 中的零。

【问题讨论】:

  • 我只是想知道谁投票给了“关闭”?我发现这个问题完全有效并且与编程相关。
  • 我不确定你是否会从利用这么小的矩阵的稀疏性中获得很多好处。

标签: c++ algorithm math sparse-matrix matrix-multiplication


【解决方案1】:

存在this 论文,处理快速稀疏矩阵乘法。所开发的算法将稀疏矩阵分为两部分:密集和稀疏,并在其上应用快速乘法算法。所以对我来说,它看起来不像你提到的关于 Strassen 的矩阵的大小,而是它是稀疏的。

【讨论】:

    【解决方案2】:

    有一些方法可以实现比密集矩阵更紧凑的稀疏矩阵。我这样做的一种方法如下:

    [0 0 0 0 0]
    [0 1 2 0 9]
    [0 0 0 2 0]
    [0 1 0 0 0]
    

    变成非零元素的线性数组

    typedef struct {
        int row;
        int col;
        double entry;
    } Element;
    
    typedef SparseMatrix Element*;
    

    所以矩阵现在的空间复杂度为 O(n) 而不是 O(n^2) 对于 A*B,其中 A 和 B 是矩阵,您只需要遍历每个数组以匹配元素(即 a->row == b->col && a->col == b->row ),并可能添加几个一起(内积)。 该算法将具有 O(n^2) 复杂度而不是 O(n^3)。这是因为您可以跳过取零的内积的琐碎操作。

    【讨论】:

    • 空间与非零元素的数量成正比,而不是元素的数量 (n)。
    【解决方案3】:

    查看 Aydın Buluc,John R. Gilbert:Highly Parallel Sparse Matrix-Matrix Multiplication

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-09
      • 2011-11-20
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      相关资源
      最近更新 更多