Cykly for

Optimizing R Code with Rcpp

Romain François

Consulting Datactive, ThinkR

4 části cyklu for v C++

  • Inicializace
  • Podmínka pokračování
  • Inkrement
  • Tělo
Optimizing R Code with Rcpp

Cyklus for – inicializace

Co se provede na začátku cyklu:

for( init ;  ;  ){

}
Optimizing R Code with Rcpp

Cyklus for – podmínka pokračování

Logická podmínka určující, zda cyklus pokračuje

for(  ; condition ;  ){

}
Optimizing R Code with Rcpp

Cyklus for – inkrement

Provede se na konci každé iterace

for(  ;  ; increment ){

}
Optimizing R Code with Rcpp

Cyklus for – tělo

Provede se při každé iteraci. Definuje, co cyklus vykonává.

for(  ;  ;  ){
    body
}
Optimizing R Code with Rcpp

Typický cyklus for

for (int i=0; i<n; i++ ){
    // some code using i
}
Optimizing R Code with Rcpp

Typický cyklus for

for (int i=0; ; ){

}
Optimizing R Code with Rcpp

Typický cyklus for

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

}
Optimizing R Code with Rcpp

Typický cyklus for

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

}
Optimizing R Code with Rcpp

Příklad: součet prvních n celých čísel

// [[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 ;
}
Optimizing R Code with Rcpp

Přerušení cyklu 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 ;
}
Optimizing R Code with Rcpp

Newtonova iterační metoda pro výpočet odmocniny

Nalezení $\sqrt{S}$ je ekvivalentní hledání kořene $f(x) = x^2 - S$

Iterační vzorec:

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

Algoritmus:

  • Zvolte počáteční hodnotu $x_0$
  • Aktualizujte $x$ pomocí výše uvedeného vzorce zadaný počet kroků
Optimizing R Code with Rcpp

Newtonova metoda v C++

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

převedeno do pseudokódu

int n = ... // počet iterací
double res = ... // inicializace

for( int i=0; i<n; i++){
    // aktualizace hodnoty res
    // tj. výpočet x_{n+1} z x_{n}
    res = ( res + S / res ) / 2.0 ; 
}

return res ;
Optimizing R Code with Rcpp

Pojďme si procvičit!

Optimizing R Code with Rcpp

Preparing Video For Download...