2011-05-01 3 views
2

주로 벡터 나리스트에서 수집 된 그래프와 유사한 데이터로 작업하고 있습니다.
대부분의 경우 지정된 인덱스별로 벡터/목록을 검사하고 현재 요소에 대한 결과 값을 결정하는 로직을 수행해야합니다.회피는 피하고 인덱스 정보는 유지

좀 더 정확하게하려면, 코드의 이러한 조각을 고려

for (i in 1:(length1 - 1)) 
    for (j in (i + 1):length2) 
     for (k in 1:length3) { 
      d1 <- data[i, k] 
      d2 <- data[j, k] 
      if (d1 != d2) 
       otherData[i, j, k] <- list(c(min(d1, d2), max(d1, d2))) 
      else 
       otherData[i, j, k] <- list(c(1, 1)) 
     } 

내 질문은 : - :

  1. 인덱스의 벡터를 만들
    는 이에게 좋은 해결책이 될 것인가 , 그리고
  2. (외부 함수에서 선언 된) 데이터 객체를보고 제공된 인덱스의 벡터를 사용하여 로직을 수행하는 내부 함수 (인덱스 벡터를 사용하는)가 적용됩니다

샘플 코드 (단순, 위의 코드에 전혀 연결) :

someFunc <- function(data) { 
    n <- length(data) 
    f <- function(i) { 
     return (doSthWith(data[i], i)) 
     # do some logic with both the data and the index 
    } 
    return (sapply(1:n, f)) 
} 

내가 생각 해낸 또 다른 솔루션하며,이 data.frame을 생성하고 인덱스를 데이터의 일부를 만드는 것입니다 lapply 함수는 기본적으로 입력 행에도 인덱스를 가지고 있습니다.

이러한 접근 방식에 대한 귀하의 생각에 매우 기뻐할 것입니다.

+0

이 당신의 계산에 병 목입니다 : 작은 그림은 설명을 보충하기 위해? 엄지 손가락의 규칙은 - for/while 루프와 작동하는 경우 (그리고 큰 데이터가없는 경우) 루프는 훌륭하고 멋쟁이입니다. 작은 재현 가능한 예를 얻을 수 있습니까? –

+0

아직 성능 측정 단계에 있지 않습니다. 항상 루핑 대신 R 스타일을 디자인하고 싶습니다. 일단 내가 올바른 마음의 틀에 들어 맞으면, 처음에는 루프 방식으로 생각하지 않고도 벡터화 된 솔루션을 생각해 낼 수 있습니다. 그래서 내가 묻는거야. 불행히도 지금 재현 가능한 예제를 제공 할 수는 없습니다. 주어진 문제를 해결하는 대신 일반적인 힌트를 생각했습니다 :) 응답 해 주셔서 감사합니다. – chemical

답변

1

글쎄, 당신은 상당한 속도 향상을위한 기회를 줄 것이다 vectorized 색인을 할 수 있습니다. 일반적으로, 대신 :

for(a in A) for(b in B) something(x[a,b]) 

당신은 할 수 있습니다 :

something_vectorized(x[as.matrix(expand.grid(A,B))]) 

* 적용

는 기본적으로 루프 래퍼, 당신이 그들에게 루프를 변환에서 가장 명확한 코드를 얻을 수 있도록. 편집

:

> system.time(replicate(100,sum(sapply(1:1000,function(x) x^2)))) 
    user system elapsed 
    0.385 0.001 0.388 
> system.time(replicate(100,sum((1:1000)^2))) 
    user system elapsed 
    0.002 0.001 0.003 
+0

감사합니다. 나는이 접근법을 실험해볼 것이다. 한가지는 나에게 이상하게 여긴다. ** 적용은 ** 대부분 내 코드를 클리어 할 수있다 ** - 복수 코어를 사용하기 위해 R의 기능을 사용하려고 할 때 * apply를 사용하면 아무런 도움이되지 않을까? – chemical

+1

@chemical 중요한 코드 일 수있는 R 코드 해석의 간접비를 고려해야합니다. R은 벡터 연산을 수행하기 때문에 스칼라 연산을 수행하는 것은 최적이 아닙니다. 그로 인해 20-30x의 속도 저하가 발생할 수 있습니다. 병렬 처리가 여기에서 도움이되지 않습니다. – mbq

+1

apply를 사용하면 병렬 컴퓨팅을 수행하는 코드와 단일 스레드를 전환하는 데 도움이됩니다. 그렇다고해서 성능을 향상시킬 수있는 것은 아닙니다 (mbq의 의견 참조). –

관련 문제