2017-01-31 16 views
6

Tôi đang chuyển đổi hàm R thành Rcpp, trong đó tôi đã sử dụng hàm R rowSums, dường như không phải là biểu thức đường hợp lệ trong Rcpp. Tôi tìm thấy mã cho một phiên bản Rcpp của rowSums here. Nhưng tôi nhận đượcCách tính hàng rowSums trong rcpp

error: use of undeclared identifier

khi tôi sử dụng rowSumsC() trong chức năng Rcpp chính của tôi.

Có sửa chữa dễ dàng không?

Chỉnh sửa: Mã

cppFunction(
    "NumericMatrix Expcpp(NumericVector x, NumericMatrix w, 
    NumericVector mu, NumericVector var, NumericVector prob, int k) { 
    for (int i=1; i<k; ++i){ 
    w(_,i) = prob[i] * dnorm(x,mu[i], sqrt(var[i])); 
    } 
    w = w/rowSums(w) 
    return w; 
}") 
+1

Hãy tạo một ví dụ tái sản xuất (ví dụ mã bưu điện và cuộc gọi). Ngoài ra, có một đường Rcpp tương đương với 'rowSums'. Nó đã được thêm vào trong Rcpp 0.12.8 – coatless

+0

Tôi đã tải lên mã. Tôi không thể thực sự gọi nó vì nó không thể được xác định do rowSums không được xác định. Tên của rcpp tương đương với rowSums và tôi có phải làm gì thêm để gọi nó không? Tôi thực sự mới với rcpp. –

Trả lời

6

Rcpp officially added rowSum support in 0.12.8. Do đó, không cần sử dụng chức năng rowSumsC do Hadley đưa ra trong Nâng cao R.

Có nói một vài vấn đề với mã.


Rcpp hiện nay không không hỗ trợ Matrix-Vector hoặc Matrix-Matrix tính toán. (Hỗ trợ cho sau này có thể được thêm vào mỗi #583, mặc dù nếu cần thiết, bạn nên cân nhắc sử dụng RcppArmadillo hoặc RcppEigen). Do đó, dòng sau là có vấn đề:

w = w/rowSums(w) 

Để giải quyết này, trước hết tính rowSums và sau đó chuẩn hóa ma trận sử dụng một vòng lặp for truyền thống. Lưu ý: Vòng lặp trong C++ rất nhanh không giống như R.

NumericVector summed_by_row = rowSums(w); 

for (int i = 0; i < k; ++i) { 
    w(_,i) = w(_,i)/summed_by_row[i]; 
} 

Tiếp theo, C++ chỉ số bắt đầu ở 0 không 1. Do đó, sau vòng lặp for là có vấn đề:

for (int i=1; i<k; ++i) 

Việc sửa chữa:

for (int i=0; i<k; ++i) 

Cuối cùng, các tham số của hàm có thể được giảm như một số các giá trị không liên quan hoặc được ghi đè .

Việc kê khai chức năng đi từ:

NumericMatrix Expcpp(NumericVector x, NumericMatrix w, 
    NumericVector mu, NumericVector var, NumericVector prob, int k) 

Để:

NumericMatrix Expcpp(NumericVector x, NumericVector mu, NumericVector var, NumericVector prob) { 

    int n = x.size(); 
    int k = mu.size(); 
    NumericMatrix w = no_init(n,k); 

    ..... 

Đưa tất cả các thông tin phản hồi trên lại với nhau, chúng tôi nhận được chức năng mong muốn.

Rcpp::cppFunction(
    'NumericMatrix Expcpp(NumericVector x, NumericVector mu, NumericVector var, NumericVector prob) { 

    int n = x.size(); 
    int k = mu.size(); 

    NumericMatrix w = no_init(n,k); 

    for (int i = 0; i < k; ++i) { // C++ indices start at 0 
    w(_,i) = prob[i] * dnorm(x, mu[i], sqrt(var[i])); 
    } 

    Rcpp::Rcout << "Before: " << std::endl << w << std::endl; 

    NumericVector summed_by_row = rowSums(w); 

    Rcpp::Rcout << "rowSum: " << summed_by_row << std::endl; 

    // normalize by column to mimic R 
    for (int i = 0; i < k; ++i) { 
    w(_,i) = w(_,i)/summed_by_row[i]; 
    } 

    Rcpp::Rcout << "After: " << std::endl << w << std::endl; 

    return w; 
    }') 

set.seed(51231) 
# Test values 
n <- 2 
x <- seq_len(n) 
mu <- x 
var <- x 
prob <- runif(n) 

mat <- Expcpp(x, mu, var, prob) 

Output

Before: 
0.0470993 0.125384 
0.0285671 0.160996 

rowSum: 0.172483 0.189563 
After: 
0.273066 0.661436 
0.165623 0.849300 
Các vấn đề liên quan