将块矩阵减少到它们的总和

时间:2016-10-13 00:30:10

标签: scala apache-spark

是否有一种有效的方法将块矩阵减少为其所有值的总和?我想要计算两个块矩阵之间的欧几里德距离(d2,在这里的响应https://math.stackexchange.com/questions/507742/distance-similarity-between-two-matrices中定义)。

作为后续工作,似乎没有一种简单的方法来减去两个块矩阵。有没有办法将每个乘以常数?

编辑:找到减法的解决方法。 V,W和H是三个矩阵。 negOneBlock是一个大小为V的矩阵,只包含负数。

V.add((W.multiply(H)).multiply(negOneBlock))

1 个答案:

答案 0 :(得分:2)

为每个块应用一个总和然后减少应该非常有效。

import org.apache.spark.mllib.linalg.distributed._

def sum(mat: BlockMatrix) = mat.blocks.map(_._2.toArray.sum).sum

,其中

_.blocks 

创建RDD[((Int, Int), Matrix)]

_._2

提取Matrix

toArray.sum

聚合块中的所有值。对于以下数据:

val mat: BlockMatrix = new CoordinateMatrix(sc.parallelize(Seq(
  MatrixEntry(0, 10, 1.0), MatrixEntry(10, 1024, 2.0),  
  MatrixEntry(3000, 10, 3.0))
)).toBlockMatrix(128, 128)

sum(mat)

我们得到6.0的预期结果。