如何RowMatrix转换为本地矩阵?

问题描述 投票:1回答:1

我有一个关于在星火矩阵的一个问题。

假设我有一个名为X这样RowMatrix

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是基于行的,我认为正确的转换呢?我真的不知道和当地的密集矩阵存储在列优先顺序,因此顺序弄乱了。

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

scala apache-spark matrix rdd apache-spark-mllib
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.