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
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
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. –