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

时间:2016-10-25 23:38:22

标签: scala apache-spark

我有一个BlockMatrix M,它代表二分图中一组顶点的邻居。我希望为表格图形构建一个完整的邻接矩阵:

Adjacency Matrix

但是,我不确定组合块矩阵的有效方法。任何帮助将不胜感激。我希望只使用MM.transpose

1 个答案:

答案 0 :(得分:1)

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

import org.apache.spark.mllib.linalg.distributed._

val rowsPerBlock = 2
val colsPerBlock = rowsPerBlock

val mat = new CoordinateMatrix(sc.parallelize(Seq(
  MatrixEntry(5, 0, 1), MatrixEntry(4, 1, 2),
  MatrixEntry(3, 2, 3), MatrixEntry(2, 3, 4),
  MatrixEntry(1, 4, 5), MatrixEntry(0, 5, 6)
))).toBlockMatrix(rowsPerBlock, colsPerBlock)

给我们:

0.0  0.0  0.0  0.0  0.0  6.0
0.0  0.0  0.0  0.0  5.0  0.0
0.0  0.0  0.0  4.0  0.0  0.0
0.0  0.0  3.0  0.0  0.0  0.0
0.0  2.0  0.0  0.0  0.0  0.0
1.0  0.0  0.0  0.0  0.0  0.0

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

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

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

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

和一个转置并移位m块:

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

最后,我们可以将这两者合并为一个矩阵:

new BlockMatrix(
  ur ++ lr,
  rowsPerBlock, colsPerBlock
)

结果为:

0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  6.0
0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  5.0  0.0
0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  4.0  0.0  0.0
0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  3.0  0.0  0.0  0.0
0.0  0.0  0.0  0.0  0.0  0.0  0.0  2.0  0.0  0.0  0.0  0.0
0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0
0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  0.0  0.0  0.0  2.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  0.0  0.0  3.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  0.0  4.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  5.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
6.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0