我有一个块矩阵m,它表示二部图中一组顶点的邻域。我希望能构造一个完整的邻接矩阵来表示:邻接矩阵然而,我不确定一个有效的方法去组合块矩阵。任何协助都将不胜感激。我只是想用 M 以及 M.transpose .
M
M.transpose
jvlzgdj91#
这是你能做的。假设你有一个简单的矩阵定义为:
import org.apache.spark.mllib.linalg.distributed._val rowsPerBlock = 2val colsPerBlock = rowsPerBlockval 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)
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.00.0 0.0 0.0 0.0 5.0 0.00.0 0.0 0.0 4.0 0.0 0.00.0 0.0 3.0 0.0 0.0 0.00.0 2.0 0.0 0.0 0.0 0.01.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 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.numRowsval m = n / rowsPerBlock
val n = mat.numRows
val m = n / rowsPerBlock
这两个创建了两个RDD,一个偏移了 m 向右移动块:
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)
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.00.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 0.00.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.00.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 0.00.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.00.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.00.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.00.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00.0 0.0 0.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00.0 0.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.06.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
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
1条答案
按热度按时间jvlzgdj91#
这是你能做的。假设你有一个简单的矩阵定义为:
这给了我们:
我们可以找到行数和块数:
这两个创建了两个RDD,一个偏移了
m
向右移动块:一个调换了位置
m
下一个街区:最后,我们可以将这两个组合成一个矩阵:
结果是: