2016-10-13 2 views
0

블록 행렬을 모든 값의 합으로 줄이는 효과적인 방법이 있습니까? 두 개의 블록 행렬 (d2, 여기서 응답 https://math.stackexchange.com/questions/507742/distance-similarity-between-two-matrices으로 정의 됨) 사이의 유클리드 거리를 계산하려고합니다.블록 행렬을 합계로 환산

후속 작업으로 두 개의 블록 행렬을 빼는 간단한 방법이없는 것처럼 보입니다. 상수로 각각 곱하는 방법이 있습니까?

편집 : 뺄셈에 대한 해결책을 찾았습니다. V, W 및 H는 세 행렬입니다. negOneBlock은 크기가 음수 인 행렬 만 포함하는 행렬입니다.

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

답변

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입니다.

관련 문제