For 루프

Rcpp로 R 코드 최적화하기

Romain François

Consulting Datactive, ThinkR

C++ for 루프의 4가지 구성 요소

  • 초기화
  • 계속 조건
  • 증감
  • 본문
Rcpp로 R 코드 최적화하기

For 루프 - 초기화

루프가 시작될 때 실행되는 부분:

for( init ;  ;  ){

}
Rcpp로 R 코드 최적화하기

For 루프 - 계속 조건

루프 계속 여부를 제어하는 논리 조건:

for(  ; condition ;  ){

}
Rcpp로 R 코드 최적화하기

For 루프 - 증감

각 반복의 끝에 실행됩니다.

for(  ;  ; increment ){

}
Rcpp로 R 코드 최적화하기

For 루프 - 본문

각 반복마다 실행됩니다. 루프가 수행하는 동작입니다.

for(  ;  ;  ){
    body
}
Rcpp로 R 코드 최적화하기

일반적인 for 루프

for (int i=0; i<n; i++ ){
    // some code using i
}
Rcpp로 R 코드 최적화하기

일반적인 for 루프

for (int i=0; ; ){

}
Rcpp로 R 코드 최적화하기

일반적인 for 루프

for (int i=0; i<n; ){

}
Rcpp로 R 코드 최적화하기

일반적인 for 루프

for (int i=0; i<n; i++){

}
Rcpp로 R 코드 최적화하기

예제: 처음 n개 정수의 합

// [[Rcpp::export]]
int nfirst( int n ){
    if( n < 0 ) {
        stop( "n must be positive, I see n=%d", n ) ;
    }

    int result = 0 ;
    for( int i=0; i<n; i++){
        result = result + (i+1) ;
    }

    return result ;
}
Rcpp로 R 코드 최적화하기

for 루프에서 빠져나오기

// [[Rcpp::export]]
int nfirst( int n ){
    if( n < 0 ) {
        stop( "n must be positive, I see n=%d", n ) ;
    }    

    int result = 0 ;
    for( int i=0; i<n; i++){
        if( i == 13 ){
            Rprintf( "I cannot handle that, I am superstitious" ) ;
            break ;
        }
        result = result + (i+1) ;
    }

    return result ;
}
Rcpp로 R 코드 최적화하기

뉴턴 반복법으로 제곱근 계산하기

$\sqrt{S}$ 를 구하는 것은 $f(x) = x^2 - S$ 의 근을 구하는 것과 같습니다.

이를 통해 다음 반복식을 도출할 수 있습니다:

$$ x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} = x_n - \frac{x^2_n - S}{2 x_n} = \frac{1}{2} \left( x_n + \frac{S}{x_n} \right) $$

알고리즘:

  • 초기값 $x_0$ 설정
  • 위 공식을 지정된 횟수만큼 반복하여 $x$ 갱신
Rcpp로 R 코드 최적화하기

C++로 구현한 뉴턴 방법

$$ x_{n+1} = \frac{1}{2} \left( x_n + \frac{S}{x_n} \right) $$

위 식을 의사 코드로 표현하면 다음과 같습니다:

int n = ... // 반복 횟수
double res = ... // 초기화

for( int i=0; i<n; i++){
    // res 값 갱신
    // 즉, x_{n}으로부터 x_{n+1} 계산
    res = ( res + S / res ) / 2.0 ; 
}

return res ;
Rcpp로 R 코드 최적화하기

연습해 봅시다!

Rcpp로 R 코드 최적화하기

Preparing Video For Download...