如何规范火花中的矩阵?

时间:2017-03-17 21:29:30

标签: scala apache-spark matrix

我需要将每个矩阵元素(i,j)除以对角元素(i,i)和(j,j)乘积的sqrt

换句话说,对于我需要执行的所有 i j

mat(i, j) = mat(i, j)/sqrt(mat(i,i)*mat(j,j))

所以矩阵:

4   0   12                 
0   1   1
12  0   9

变成:

1   0   2                 
0   1   1
2   0   1

到目前为止我所拥有的是行/列索引对的列表,其权重转换为CoordinateMatrix(以及后来的RowMatrix)。我通过过滤行==列的元素来提取对角线。

实现此元素划分的最佳方法是什么?

import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, MatrixEntry, RowMatrix}
import scala.math.sqrt

val pairs = Array((0,0,4.0), (0,2,12.0), (1,1,1.0), (2,0,12.0), (2,2,9.0))
val pairs_rdd = sc.parallelize(pairs)

val diagonal = pairs_rdd.filter(r => r._1 == r._2).map(r => (r._2, sqrt(r._3)))

val matrixEntries = pairs_rdd.map(r => MatrixEntry(r._1, r._2, r._3))

val coordinateMatrix: CoordinateMatrix = new CoordinateMatrix(matrixEntries)
val rowMatrix: RowMatrix = coordinateMatrix.toRowMatrix()

1 个答案:

答案 0 :(得分:2)

似乎没有任何MLLib矩阵辅助类可以在这里真正起作用,所以唯一的出路似乎是将矩阵与你创建的对角线手动连接(一次由for i in range(1,7) ,一次由while i > 0 and arrayInsertion [i+1] > arrayInsertion [i] ):

i