2012-05-18 6 views
0

저는 벡터화와 R에서 루프 속도를 높이기 위해 어떻게 적용 할 수 있는지 알고 있습니다 만, 각 반복이 이전 반복의 결과에 의존하는 벡터를 사용하여 코드 속도를 높이는 방법을 찾지 못했습니다. 반복적 인 랜덤 간격 계산에 의존한다. 예를 들어R에 대한 결과 종속적 인 루프 최적화

:

Josh-- 미안.

m <- c(1, 1) 
w.r <- c(0.33592935393, 0.63825353030, 0.15335253356) 

및 rlistl 3 × 2 행렬의 목록입니다 : 그래서, 여기에 자세한 내용입니다. 그래서 대화를 위해,

r0 <- matrix(0, 2, 2) 
r1 <- matrix(1, 2, 2) 
r2 <- matrix(2, 2, 2) 
rlist <- list(r0, r1, r2) 

N <- 500 
E <- matrix(0, N, 2) 

for(i in 1:N) { 
    r <- c(c(1:3) %*% rmultinom(1, 1, w.r)) 
    E[i, ] <- mvrnorm(1, m, rlist[[r]]) 
} 

위해 나는 복용 해봤 - 루프 밖에서 "R < multinom()"calcuation을하고 rprof은 소요되는 시간의 대부분은, 분명히, mvnorm에 보여줍니다. 벡터를 사용하여 속도를 빠르게하는 방법을 알아낼 수 있습니까?

는 여기에 또 다른 예를

for(i in 1:N) { 
    if(d$V[i, 1] & d$V[i, 2]) QQ <- 1 
    else if(! d$V[i, 1] & d$V[i, 2]) QQ <- 2 
    else if(! d$V[i, 1] & ! d$V[i, 2]) QQ <- 3 
    else if(d$V[i, 1] & ! d$V[i, 2]) QQ <- 4 

    U[i, ] <- r1bvtruncnorm(mux=mu.U[i, ]/sd.r[r1], rho=rho, q=QQ) 

에게}의

그 어떤 빠르게 실행하는 방법을 알아낼 수 없습니다. 내 문제의 일부는 내가 C/C++ 프로그래머이지만, R을 읽고 너무 쉽게 뭔가를 놓치지 않으려 고 노력하고있다.

감사합니다.

편집 :

저스틴 :

OK--

그래서 난 당신의 제안을했지만, 내가 두려워으로, 담당자가() 나는 기대했다처럼 행동하지 않습니다. 난 매번 별도의 난수가 필요하지만 rep()를 사용하면 rmultinom을 한 번 호출하고 그 결과를 100 번 복제합니다.

>rep(c(c(1:3) %*% rmultinom(1, 1, ww.r)), 100) 
    [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
[38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
[75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 

> rep(c(c(1:3) %*% rmultinom(1, 1, ww.r)), 100) 
    [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
[38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
[75] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+7

'첫 번째 코드 블록 wr' 무엇 :

r <- 1:3 %*% rmultinom(N, 1, w.r) E <- t(sapply(r, function(x) mvrnorm(1, m, rlist[[x]]))) 

또는 하나의 지저분한 라인에

? 그대로서도 재현 할 수 없으며 상자에서도 실행되는 코드를 제공하면 더 나은 응답을 얻을 수 있습니다! –

+0

조쉬 - 죄송합니다. 그래서, 여기에 더욱 상세히이다 : m <- C (1, 1) w.r <- C (0.252201578098282, 0.585225059235736, 0.162573362665982) rlistl 및 3 × 2 행렬들의 목록이다. (2, 2, 2) r0 <- 행렬 (0, 2, 2) r1 <- 행렬 (1,2,2) r2 <- 행렬 (2,2,2) rlist <- 목록 (r0, r1, r2) – HodorTheCoder

답변

0

내가 옳지 않았다고 생각하는 것에 대해서는 조쉬의 의견을 참조하십시오.

하지만 아무 것도 남기지 않았다면 w.r은 일정하므로 루프에서 제거해야합니다. m도 일정합니다. 'r'과 rlist [[r]]는 무작위로 생성되지만 상수 매개 변수가 있습니다. 그래서 당신이하고있는 일은 똑같은 매개 변수들로부터 분포가 정확히 N 번 생성되는 것입니다, 맞습니까? 그렇다면 for 루프보다 더 나은 선택이 있습니다. 예 : 당신에게 루프 첫 번째와 같은 결과를 제공한다

E <- matrix(rep(mvrnorm(1, 
         m, 
         rlist[[c(1:3 %*% rmultinom(1, 1, w.r))]]), 
       N), 
      N, 
      2) 

.

두 번째 예제는 단지 함수가되고 apply을 사용할 수 있습니다. 그러나 d 개체의 실제 구조를 알지 못했을 때 그 개체에 접근하는 것이 가장 어렵습니다. 나는 data.frames의 data.frame이나리스트의 명명 된리스트와 같은 것을 가정하고있다.코멘트를 편집

my.fun <- function(vec) { 
    if(vec[1] & vec[2]) return(1) 
    else if(! vec[1] & vec[2]) return(2) 
    else if(! vec[1] & ! vec[2]) return(3) 
    else if(vec[1] & ! vec[2]) return(4) 
} 

QQ <- apply(d$V, 1, my.fun) 

: 어디 d$V은 약 2 차원 데이터 구조입니다

t(sapply(1:3 %*% rmultinom(N, 1, w.r), function(x) mvrnorm(1, m, rlist[[x]]))) 
+0

예 - 그럼, wr과 m은 모두 상수입니다. 나는 당신이 그 방법으로 실제로 rep을 사용할 수 있다는 것을 몰랐습니다. 멋지다! 나는 그것을 시도 할 것이다. – HodorTheCoder

+0

저스틴 - 제안이 작동하지 않았습니다. 내 원래 게시물의 편집을 참조하십시오. – HodorTheCoder

+0

'rmultinom (N, 1, w.r)'그것을 고쳐 주시겠습니까? – Justin

관련 문제