2015-02-02 3 views
2

for 루프에서 25000 x 25000 행렬을 채우려고하지만 R이 나를 잠급니다. 데이터에는 많은 수의 항목이 있으므로 스파 스 매트릭스가 적합할까요?큰 행렬 및 계산 채우기

다음은 몇 가지 샘플 데이터 및 코드입니다.

x<-c(1,3,0,4,1,0,4,1,1,4) 
y<-x 

z<-matrix(NA,nrow=10,ncol=10) 

for(i in 1:10){ 
    if(x[i]==0){ 
     z[i,]=0 
    } else{ 
      for(j in 1:10){ 
      if(x[i]==y[j]){ 
      z[i,j]=1 
      } else{z[i,j]=0 
      } 
      } 
     } 
} 

다른 질문이 있습니다. 이 큰 행렬에 대한 계산을 수행 할 수 있습니까? 이 크기의 일부 샘플 행렬에 대해 계산을 수행 할 때 정수 오버플로 또는 R이 완전히 잠기는 경고가있는 NA 출력을 얻습니다.

+0

아마, 달성하고자하는 것에 대해 더 많은 정보를 제공하는 것이 더 도움이 될 것입니다. 즉,이 특정 문제는 'outer (x, x, "==") * (x! = 0)'로 해결할 수 있습니다. 그럼에도 불구하고 패키지 "매트릭스"가 여기에 매우 유용합니다. –

답변

2

벡터화하면 도움이 될 것입니다. 또한 데이터가 실제로 희소하고 드문 드문 행렬에 대한 분석을 수행 할 수 있다면 확실히 고려해야 할 사항입니다.

library(Matrix) 

# set up all pairs 
pairs <- expand.grid(x,x) 
# get matrix indices 
idx <- which(pairs[,1] == pairs[,2] & pairs[,1] != 0) 

# create empty matrix with zero's instead 
z<-matrix(0,nrow=10,ncol=10) 
z[idx] = 1 

# create empty sparse matrix 
z2 <-Matrix(0,nrow=10,ncol=10, sparse=TRUE) 
z2[idx] = 1 

all(z == z2) 
[1] TRUE 

@alexis_lax의 주석은 더욱 간단하고 빠릅니다. 나는 outer 기능에 대해 완전히 잊어 버렸습니다.

# normal matrix 
z = outer(x, x, "==") * (x!=0) 

# sparse matrix 
z2 = Matrix(outer(x, x, "==") * (x!=0), sparse=TRUE) 

계산이 큰 행렬에서 수행 될 수 있다면 두 번째 질문에 대답하려면 대답은 '예'입니다. 보다 조심스럽게 접근하고 적절한 도구를 사용해야합니다. 스파 스 매트릭스는 좋으며 많은 일반적인 매트릭스 함수를 사용할 수 있으며 다른 패키지는 호환 가능합니다. 다음은 몇 가지 예가 들어있는 페이지의 link입니다.

정말로 큰 매트릭스로 작업하는 경우 R의 큰 오버 헤드를 처리하도록 설계된 bigmemory과 같은 다른 패키지를 조사하고 싶을 수 있습니다.