2012-12-02 3 views
0

큰 입력 매트릭스 (4000x10000)가 있습니다. 나는 그것에 대해 유클리드 거리 행렬을 계산하기 위해 dist()을 사용합니다 (약 5 시간 걸립니다).
추가 행이있는 "동일한"행렬의 거리 행렬을 계산해야합니다 (4001x10000 행렬의 경우). 행렬 전체를 다시 계산하지 않고 거리 행렬을 결정하는 가장 빠른 방법은 무엇입니까?거리 매트릭스 재 계산

+1

어떻게 할 수 있는지 알고 계시지 않습니까? 아니면 어떻게 해야할지 모르십니까? – carlosdc

+1

여분의 행이 추가 점입니까, 추가 변수/치수입니까? – flodel

답변

1

추가 행이 추가 포인트라고 가정합니다. 추가 변수/차원을 의미하는 경우 다른 대답을 요구합니다.

우선 매트릭스의 유클리드 거리에 대해서는 패키지의 rdist 함수를 사용하는 것이 좋습니다. Fortran으로 작성되었으며 dist 기능보다 훨씬 빠릅니다. dist 개체 대신 matrix을 반환하지만 as.matrixas.dist을 사용하면 항상 한 개체에서 다른 개체로 이동할 수 있습니다. 여기

샘플 데이터

num.points <- 400 
num.vars <- 1000 
original.points <- matrix(runif(num.points * num.vars), 
          nrow = num.points, ncol = num.vars) 

과의 거리가 이미 계산 된 매트릭스 (당신보다 작은)입니다 : 여분의 포인트 (들)에 대한

d0 <- rdist(original.points) 

, 당신은 단지 거리를 계산하기 위해 필요 여분의 점들과 여분의 점들과 원래의 점들 사이의 거리들 사이.

d1 <- rbind(cbind(d0, t(outer.dist)), 
      cbind(outer.dist, inner.dist)) 

이의 그것과 일치하는지 확인하자

extra.points <- matrix(runif(2 * num.vars), nrow = 2) 
inner.dist <- rdist(extra.points) 
outer.dist <- rdist(extra.points, original.points) 

그래서 당신은 당신의 더 큰 거리 행렬에 바인딩 할 수 있습니다 : 나는이 솔루션은 추가 포인트의 수에 일반적입니다 것을 보여주기 위해 두 개의 추가 포인트를 사용합니다

d2 <- rdist(rbind(original.points, extra.points)) 

identical(d1, d2) 
# [1] TRUE 
+0

다음을 사용하려고했습니다 : mydist <-dist (original.points) mydist <- as.matrix (mydist) euc.dist <-function (x) { sqrt (sum ((여분의 점 -x)^2)) } extra.dist <-apply (original.points, 1, euc.dist) rbind (mydist, extra.dist) 내 문제는 클래스 "dist" – sztup

+0

거리 매트릭스는 정사각형 매트릭스입니다. 끝에 행을 하나만 추가하는 경우 마지막에 열을 추가해야하며 오른쪽 하단의 값은 0이어야합니다 (추가 점과 자체 사이의 거리). 하지만 제 솔루션을 읽어주세요. – flodel