Les boucles for

Optimiser le code R avec Rcpp

Romain François

Consulting Datactive, ThinkR

Les 4 parties des boucles for en C++

  • Initialisation
  • Condition de poursuite
  • Incrément
  • Corps
Optimiser le code R avec Rcpp

Boucles for – l'initialisation

Ce qui se passe au tout début de la boucle :

for( init ;  ;  ){

}
Optimiser le code R avec Rcpp

Boucles for – la condition de poursuite

Condition logique qui détermine si la boucle continue

for(  ; condition ;  ){

}
Optimiser le code R avec Rcpp

Boucles for – l'incrément

Exécuté à la fin de chaque itération

for(  ;  ; increment ){

}
Optimiser le code R avec Rcpp

Boucles for – le corps

Exécuté à chaque itération. Ce que fait la boucle.

for(  ;  ;  ){
    body
}
Optimiser le code R avec Rcpp

Boucle for typique

for (int i=0; i<n; i++ ){
    // some code using i
}
Optimiser le code R avec Rcpp

Boucle for typique

for (int i=0; ; ){

}
Optimiser le code R avec Rcpp

Boucle for typique

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

}
Optimiser le code R avec Rcpp

Boucle for typique

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

}
Optimiser le code R avec Rcpp

Exemple : somme des n premiers entiers

// [[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 ;
}
Optimiser le code R avec Rcpp

Interrompre une boucle 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 ;
}
Optimiser le code R avec Rcpp

Méthode itérative de Newton pour la racine carrée

Trouver $\sqrt{S}$ revient à trouver la racine de $f(x) = x^2 - S$.

Ce qui mène à l'itération :

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

Algorithme :

  • Choisir une valeur initiale $x_0$
  • Mettre à jour $x$ avec la formule ci-dessus un certain nombre de fois
Optimiser le code R avec Rcpp

Méthode de Newton en C++

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

se traduit en pseudo-code :

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 ;
Optimiser le code R avec Rcpp

Passons à la pratique !

Optimiser le code R avec Rcpp

Preparing Video For Download...