如何将RowMatrix转换为本地Matrix?

时间:2019-02-11 18:13:42

标签: scala apache-spark matrix rdd apache-spark-mllib

我在Spark中有关于矩阵的问题。

假设我有一个名为RowMatrix的X,如下所示:

0.5    0.5  
0.25   0.0625
0.125  0.125
0.0625 0.0625
0.0625 0.25

现在我要做的是将此RowMatrixRowMatrix X的转置版本相乘。

0.5 0.25   0.125 0.0625 0.0625
0.5 0.0625 0.125 0.0625 0.25

现在,就我所知,我无法将RowMatrix与另一个RowMatrix相乘,它必须是一个RowMatrix和一个局部矩阵。因此,我尝试使用以下代码将RowMatrix转换为局部密集矩阵:

val arr = X.rows.map(x=>x.toArray).collect.flatten
val Xlocal = Matrices.dense(X.numRows.toInt,X.numCols.toInt,arr)

但是它不能正确转换,因为我认为RowMatrix是基于行的?我不太确定,局部密集矩阵是否按列的主要顺序存储,所以顺序混乱了。

有人可以帮助我实现这一点吗?

1 个答案:

答案 0 :(得分:0)

RowMatrix没有任何行索引,仅应在行顺序无关紧要时使用。如果订单确实重要,请改用IndexedRowMatrix

可以将RowMatrix转换为IndexedRowMatrix,但请注意,不能保证顺序,最好直接使用IndexedRowMatrix。假设rowMat是要转换的矩阵:

val indRowMax = new IndexedRowMatrix(rowMat.rows.zipWithIndex().map{ case (v, id) => IndexedRow(id, v)})

IndexedRowMatrix可以轻松转换为本地矩阵:

val localMat = indRowMax.toBlockMatrix().toLocalMatrix()

并与转置相乘可以完成以下操作:

indRowMax.multiply(localMat.transpose)