Vòng lặp for

Tối ưu hóa mã R với Rcpp

Romain François

Consulting Datactive, ThinkR

4 phần của vòng lặp for trong C++

  • Khởi tạo
  • Điều kiện tiếp tục
  • Tăng
  • Thân
Tối ưu hóa mã R với Rcpp

Vòng lặp for - phần khởi tạo

Xảy ra ngay lúc bắt đầu vòng lặp:

for( init ;  ;  ){

}
Tối ưu hóa mã R với Rcpp

Vòng lặp for - điều kiện tiếp tục

Điều kiện logic kiểm soát việc vòng lặp có tiếp tục không

for(  ; condition ;  ){

}
Tối ưu hóa mã R với Rcpp

Vòng lặp for - bước tăng

Thực thi ở cuối mỗi vòng lặp

for(  ;  ; increment ){

}
Tối ưu hóa mã R với Rcpp

Vòng lặp for - thân

Thực thi ở mỗi vòng lặp. Việc vòng lặp làm.

for(  ;  ;  ){
    body
}
Tối ưu hóa mã R với Rcpp

Vòng lặp for điển hình

for (int i=0; i<n; i++ ){
    // some code using i
}
Tối ưu hóa mã R với Rcpp

Vòng lặp for điển hình

for (int i=0; ; ){

}
Tối ưu hóa mã R với Rcpp

Vòng lặp for điển hình

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

}
Tối ưu hóa mã R với Rcpp

Vòng lặp for điển hình

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

}
Tối ưu hóa mã R với Rcpp

Ví dụ: tổng của n số nguyên đầu tiên

// [[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 ;
}
Tối ưu hóa mã R với Rcpp

Thoát khỏi vòng lặp 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 ;
}
Tối ưu hóa mã R với Rcpp

Phương pháp lặp Newton để tính căn bậc hai

Tìm $\sqrt{S}$ tương đương với tìm nghiệm của $f(x) = x^2 - S$

Dẫn đến biểu thức lặp:

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

Thuật toán:

  • Chọn giá trị khởi tạo $x_0$
  • Cập nhật $x$ theo công thức trên một số lần nhất định
Tối ưu hóa mã R với Rcpp

Phương pháp Newton trong C++

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

chuyển thành mã giả:

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 ;
Tối ưu hóa mã R với Rcpp

Cùng luyện tập nào!

Tối ưu hóa mã R với Rcpp

Preparing Video For Download...