For döngüleri

Rcpp ile R Kodunu Optimize Etme

Romain François

Consulting Datactive, ThinkR

C++ for döngülerinin 4 parçası

  • Başlatma
  • Devam koşulu
  • Artırma
  • Gövde
Rcpp ile R Kodunu Optimize Etme

For döngüleri - başlatma

Döngünün en başında olanlar:

for( init ;  ;  ){

}
Rcpp ile R Kodunu Optimize Etme

For döngüleri - devam koşulu

Döngünün sürüp sürmeyeceğini belirleyen mantıksal koşul

for(  ; condition ;  ){

}
Rcpp ile R Kodunu Optimize Etme

For döngüleri - artırma

Her yinelemenin sonunda çalışır

for(  ;  ; increment ){

}
Rcpp ile R Kodunu Optimize Etme

For döngüleri - gövde

Her yinelemede çalışır. Döngünün yaptığı iş.

for(  ;  ;  ){
    body
}
Rcpp ile R Kodunu Optimize Etme

Tipik for döngüsü

for (int i=0; i<n; i++ ){
    // some code using i
}
Rcpp ile R Kodunu Optimize Etme

Tipik for döngüsü

for (int i=0; ; ){

}
Rcpp ile R Kodunu Optimize Etme

Tipik for döngüsü

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

}
Rcpp ile R Kodunu Optimize Etme

Tipik for döngüsü

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

}
Rcpp ile R Kodunu Optimize Etme

Örnek: ilk n tamsayının toplamı

// [[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 ile R Kodunu Optimize Etme

Bir for döngüsünden çıkmak

// [[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 ile R Kodunu Optimize Etme

Karekök için Newton yineleme yöntemi

$\sqrt{S}$ bulmak, $f(x) = x^2 - S$ denkleminin kökünü bulmaya denktir.

Şu yinelemeli ifadeye götürür:

$$ 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) $$

Algoritma:

  • Başlangıç değeri olarak $x_0$ al
  • Yukarıdaki formülle $x$'i belirli sayıda güncelle
Rcpp ile R Kodunu Optimize Etme

C++'ta Newton yöntemi

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

şu sözde koda dönüşür

int n = ... // number of iterations
double res = ... // initialization

for( int i=0; i<n; i++){
    // update the value of res
    // i.e. calculate x_{n+1} given x_{n}
    res = ( res + S / res ) / 2.0 ; 
}

return res ;
Rcpp ile R Kodunu Optimize Etme

Hadi pratik yapalım!

Rcpp ile R Kodunu Optimize Etme

Preparing Video For Download...