【发布时间】:2017-03-18 06:33:42
【问题描述】:
我需要将每个矩阵元素 (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()
【问题讨论】:
标签: scala apache-spark matrix