Pętle for

Optymalizacja kodu R za pomocą Rcpp

Romain François

Consulting Datactive, ThinkR

4 części pętli for w C++

  • Inicjalizacja
  • Warunek kontynuacji
  • Inkrementacja
  • Ciało
Optymalizacja kodu R za pomocą Rcpp

Pętla for – inicjalizacja

Co dzieje się na początku pętli:

for( init ;  ;  ){

}
Optymalizacja kodu R za pomocą Rcpp

Pętla for – warunek kontynuacji

Warunek logiczny sterujący kontynuacją pętli

for(  ; condition ;  ){

}
Optymalizacja kodu R za pomocą Rcpp

Pętla for – inkrementacja

Wykonywana na końcu każdej iteracji

for(  ;  ; increment ){

}
Optymalizacja kodu R za pomocą Rcpp

Pętla for – ciało

Wykonywana w każdej iteracji. To, co robi pętla.

for(  ;  ;  ){
    body
}
Optymalizacja kodu R za pomocą Rcpp

Typowa pętla for

for (int i=0; i<n; i++ ){
    // some code using i
}
Optymalizacja kodu R za pomocą Rcpp

Typowa pętla for

for (int i=0; ; ){

}
Optymalizacja kodu R za pomocą Rcpp

Typowa pętla for

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

}
Optymalizacja kodu R za pomocą Rcpp

Typowa pętla for

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

}
Optymalizacja kodu R za pomocą Rcpp

Przykład: suma n pierwszych liczb całkowitych

// [[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 ;
}
Optymalizacja kodu R za pomocą Rcpp

Przerywanie pętli 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 ;
}
Optymalizacja kodu R za pomocą Rcpp

Metoda Newtona do obliczania pierwiastków kwadratowych

Znalezienie $\sqrt{S}$ jest równoważne znalezieniu pierwiastka funkcji $f(x) = x^2 - S$

Co prowadzi do wyrażenia iteracyjnego:

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

Algorytm:

  • Przyjmij wartość początkową $x_0$
  • Aktualizuj $x$ podaną liczbę razy za pomocą powyższego wzoru
Optymalizacja kodu R za pomocą Rcpp

Metoda Newtona w C++

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

tłumaczy się na pseudokod

int n = ... // liczba iteracji
double res = ... // inicjalizacja

for( int i=0; i<n; i++){
    // aktualizacja wartości res
    // tj. obliczenie x_{n+1} dla x_{n}
    res = ( res + S / res ) / 2.0 ; 
}

return res ;
Optymalizacja kodu R za pomocą Rcpp

Czas na ćwiczenia!

Optymalizacja kodu R za pomocą Rcpp

Preparing Video For Download...