2017-01-19 2 views
0

큰 문제가 있습니다.매우 큰 벡터와 함께 pointDistance를 사용하는 방법

큰 래스터 (행 = 180, 열 수 = 480, 셀 수 = 86400) 처음에는 이진화하여 (1과 0이되도록) 클러스터를 분류했습니다. 1이고 서로 연결된 셀은 같은 라벨을 가지고 있습니다.) 이제는 셀 사이의 모든 거리를 0으로 계산해야합니다. 많은 것이 조용하고 내 큰 문제입니다. I (0하지 않은 세포의 위치 (즉, 세포 수를) 얻을,) 내가 관심이있는 셀의 좌표를 얻기 위해 이런 짓을 :

V=getValues(label) 
Vu=c(1:max(V)) 
pos=which(V %in% Vu) 
XY=xyFromCell(label,pos) 

이 아주 잘 작동합니다. 따라서 XY는 모든 좌표 (0이 아닌 셀)를 포함하는 행렬입니다. 하지만 지금은 고군분투하고 있습니다. 이 모든 좌표 사이의 거리를 계산해야합니다. 그 다음 나는 그들 중 한 명을 거리 43 개 중 하나에 넣어야한다. 그것은 종류의이 (그냥 예) 같은있다 :

pD=pointDistance(XY,lonlat=FALSE) 

R이이 크기의 벡터를 할당 할 수 없습니다 말한다 :

0<x<0.2  bin 1 
0.2<x<0.4 bin2 

내가 이것을 사용하는 경우. 너무 커지고 있습니다. 내가 예를 들어, 이것을하려고 할 때

for (i in 1:nrow(XY)) 
{pD=PointDistance(XY,XY[i,],lonlat=FALSE) 
pDbin=as.matrix(table(cut(pD,breaks=seq(0,8.6,by=0.2),Labels=1:43))) 
df=cbind(df,pDbin) 
df=apply(df,1,FUN=function(x) sum(x))} 

그것은이 작동 : 그때 내가이 (같은 빈 데이터 프레임 DF 또는 무언가를 만들고 함수 pointDistance는 XY의 모든 단일 값을 통해 실행할 수 있도록) 할 수 있다고 생각 XY의 처음 50 개 값. 하지만 전체 XY 매트릭스에 사용하면 너무 많은 시간이 걸립니다. (때로는이 XY 매트릭스에 10000 xy 좌표가 포함되어 있습니다.) 누구나 빨리 할 수있는 방법이 있습니까?

+0

R이 매번 복사본을 만들어야하므로 한 번에 하나의 열을 추가하여 데이터 프레임을 늘리는 것이 느립니다. 필요한 공간을 미리 할당하십시오. 하지만 어쩌면 더 많은 메모리가 필요하거나 문제를 간단하게 만들 수 있습니다. –

+0

마지막 줄은'df = rowSums (df)'로 바꿀 수있는 것처럼 보입니다. 그게 조금 도움이 될거야. – rosscova

답변

0

이것이 빠른지 아닌지는 잘 모르겠습니다. 이것을 시도해 보는 것이 좋습니다. 각 셀에 dataframe 값이 0 또는 1이라고 가정 해 보겠습니다. 좌표 당신이 아래의 코드를 작성하기 만하면됩니다를 찾으려면 :

cord_matrix <- which(dataframe == 1, arr.ind = TRUE) 

를 이제, 당신은이 row 지수와 column 지수 매트릭스 좌표 얻을. 유클리드 거리를 찾으려면 dist() 기능을 사용하십시오. 그것을 통해 이동하십시오. 다음과 같이 표시됩니다.

dist_vector <- dist(cord_matrix) 

낮은 삼각 행렬을 반환합니다. 벡터/대칭 행렬로 변환 될 수 있습니다. 이제 사용자의 요구 사항에 따라 저장소를 계산하면됩니다.

특정 메모리 공간에서 작동하는지 알려주세요.

+0

고맙습니다. 나는 당신의 증오심을 시험해 보았고 실제로 더 빨리 작동합니다. 그러나이 "dist"를 벡터로 변환하기를 원한다면 여전히 너무 큽니다. 그것은 "이 크기의 벡터를 할당 할 수 없습니다"라고 말합니다. 그리고 "dist"값을 이전에 벡터로 변환하지 않고 어떻게 bin으로자를 수 있는지 모르겠습니다. – Cocilein

+0

'dist()'함수는 실제로 벡터 형식으로 출력을 반환합니다. 'length()'로 체크하면'dist()'에 의해 모든'dist()'값에 접근 할 수 있습니다. 그래서,'dist()'출력을 벡터로 명시 적으로 변환 할 필요가 없으므로 메모리를 더 많이 먹을 수 있다고 생각합니다. – BoyInDaBox89

+0

하지만 그걸로 쓰레기통을 계산하는 방법을 모르겠습니다. 나는 그것을 하루 종일 해 보려고 노력했다. 그러나이 dist()가 너무 크기 때문에 컷 함수가 작동하지 않습니다. – Cocilein

관련 문제