是否有一种有效的方法将块矩阵减少为其所有值的总和?我想要计算两个块矩阵之间的欧几里德距离(d2,在这里的响应https://math.stackexchange.com/questions/507742/distance-similarity-between-two-matrices中定义)。
作为后续工作,似乎没有一种简单的方法来减去两个块矩阵。有没有办法将每个乘以常数?
编辑:找到减法的解决方法。 V,W和H是三个矩阵。 negOneBlock是一个大小为V的矩阵,只包含负数。
V.add((W.multiply(H)).multiply(negOneBlock))
答案 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的预期结果。