将块矩阵组合成更大的块矩阵

l2osamch  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(513)

我有一个块矩阵m,它表示二部图中一组顶点的邻域。我希望能构造一个完整的邻接矩阵来表示:
邻接矩阵
然而,我不确定一个有效的方法去组合块矩阵。任何协助都将不胜感激。我只是想用 M 以及 M.transpose .

jvlzgdj9

jvlzgdj91#

这是你能做的。假设你有一个简单的矩阵定义为:

  1. import org.apache.spark.mllib.linalg.distributed._
  2. val rowsPerBlock = 2
  3. val colsPerBlock = rowsPerBlock
  4. val mat = new CoordinateMatrix(sc.parallelize(Seq(
  5. MatrixEntry(5, 0, 1), MatrixEntry(4, 1, 2),
  6. MatrixEntry(3, 2, 3), MatrixEntry(2, 3, 4),
  7. MatrixEntry(1, 4, 5), MatrixEntry(0, 5, 6)
  8. ))).toBlockMatrix(rowsPerBlock, colsPerBlock)

这给了我们:

  1. 0.0 0.0 0.0 0.0 0.0 6.0
  2. 0.0 0.0 0.0 0.0 5.0 0.0
  3. 0.0 0.0 0.0 4.0 0.0 0.0
  4. 0.0 0.0 3.0 0.0 0.0 0.0
  5. 0.0 2.0 0.0 0.0 0.0 0.0
  6. 1.0 0.0 0.0 0.0 0.0 0.0

我们可以找到行数和块数:

  1. val n = mat.numRows
  2. val m = n / rowsPerBlock

这两个创建了两个RDD,一个偏移了 m 向右移动块:

  1. val ur = mat.blocks.map { case ((i, j), mat) => ((i, j + m), mat) }

一个调换了位置 m 下一个街区:

  1. val lr = mat.transpose.blocks.map { case ((i, j), mat) => ((i + m, j),mat) }

最后,我们可以将这两个组合成一个矩阵:

  1. new BlockMatrix(
  2. ur ++ lr,
  3. rowsPerBlock, colsPerBlock
  4. )

结果是:

  1. 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0
  2. 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 0.0
  3. 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0
  4. 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 0.0
  5. 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0
  6. 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0
  7. 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0
  8. 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
  9. 0.0 0.0 0.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
  10. 0.0 0.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
  11. 0.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
  12. 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
展开查看全部

相关问题