Rcpp로 R 코드 최적화하기
Romain François
Consulting Datactive, ThinkR
루프가 시작될 때 실행되는 부분:
for( init ; ; ){
}
루프 계속 여부를 제어하는 논리 조건:
for( ; condition ; ){
}
각 반복의 끝에 실행됩니다.
for( ; ; increment ){
}
각 반복마다 실행됩니다. 루프가 수행하는 동작입니다.
for( ; ; ){
body
}
for (int i=0; i<n; i++ ){
// some code using i
}
for (int i=0; ; ){
}
for (int i=0; i<n; ){
}
for (int i=0; i<n; i++){
}
// [[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::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 ;
}
$\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_{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 코드 최적화하기