2014-06-17 1 views
1

내 코드는 아래 함수를 여러 번 호출합니다. Rprof를 사용하여 실행 시간의 1/3을 차지하고 있음을 확인했습니다.복잡한 알고리즘의 R에서 벡터화

저는 벡터화를 통해 R을 더 빠르게 만들 수 있다고 들었습니다. 그러나, 사용하고있는 알고리즘은 두 개의 서로 다른 목록에서 두 개의 인덱스에 액세스하므로 * 플라이 (ply) 함수가 어떻게 작동하는지 보지 못합니다.

최적화를 위해 수행 할 수있는 다른 방법이 있습니까? , U와 V는 복잡한 숫자

psi <- function(n, u, v) 
{ 
    psi = complex(real = 0, imaginary = 0) 

    for (i in 1 : (n - 1)) 
    { 
     for (j in (i + 1) : n) 
     { 
      psi = psi + log(u[i] * v[j] - u[j] * v[i]) 
     } 
    } 

    return (psi * 3) 
} 

답변

1

의 목록은 내가 경우 올바르게 코드를 읽으면 n=4 당신의 합계가 정말

log(u[1]*v[2] - u[2]*v[1]) + 
log(u[1]*v[3] - u[3]*v[1]) + 
log(u[1]*v[4] - u[4]*v[1]) + 

log(u[2]*v[3] - u[3]*v[2]) + 
log(u[2]*v[4] - u[4]*v[2]) + 

log(u[3]*v[4] - u[4]*v[3]) 

아래로 비등의 정수이다

N

입니다 n의 가능한 모든 조합은 2를 선택하십시오. combn()을 사용하여 이러한 색인 목록을 작성할 수 있습니다.

psi <- function(n,u,v) { 
    mx <- function(p) {a<-p[1]; b<-p[2]; log(u[a]*v[b]-u[b]*v[a])} 
    sum(combn(n,2, FUN=mx)) * 3 
} 

여기서 내측 mx 지수 함수의 각 쌍에 대한 계산을 처리한다. 이것은 현저하게 빠르다. 나는 그들이 같은 결과를 얻길 원한다고 생각합니다. log을 화나게하지 않는 테스트 입력을 생성하는 데 어려움을 겪었습니다.

1

다음 내용이 귀하의 문제를 해결할 수도 있습니다. 나는 당신이 이미 한 것을 생각하면 매우 투명하다고 생각하기 때문에이 표현 방법을 선택했습니다. 본질적으로 나는 방금 i와 j의 벡터를 생성하여 벡터처럼 사용했지만 (벡터를 복사하여 방정식을 붙여 넣었습니다.) 그것은 전체 조합이 모든 한 번에 당신의 루프가 발생하고 있다는 설정 생성 및 메모리에 유지해야하기 때문에 n이 매우 큰 숫자가 아니므로

psi <- function(n,u,v) { 
    j <- combn(n, 2) #I'll overwrite j later to conserve memory 
    i <- j[1,] 
    j <- j[2,] 
    sum(log(u[i] * v[j] - u[j] * v[i])) * 3 
} 

이 한 당신의 루프에 비해 매우 빨라집니다 . 그러나이 시점에서 이것은 당신을 무너 뜨릴 것입니다.

색인을 생성하는 방법과 현재 색인 생성 방법을 비교 한 결과를 고려해보십시오.

n <- 5 
combn(n, 2) 

for (i in 1 : (n - 1)) 
{ 
    for (j in (i + 1) : n) 
    { 
     print(c(i, j)) 
    } 
}