我在Spark中有关于矩阵的问题。
假设我有一个名为RowMatrix
的X,如下所示:
0.5 0.5
0.25 0.0625
0.125 0.125
0.0625 0.0625
0.0625 0.25
现在我要做的是将此RowMatrix
与RowMatrix
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
是基于行的?我不太确定,局部密集矩阵是否按列的主要顺序存储,所以顺序混乱了。
有人可以帮助我实现这一点吗?
答案 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)