gpt4 book ai didi

r - 如何在 rcpp 中计算 rowSums

转载 作者:行者123 更新时间:2023-12-03 18:19:59 26 4
gpt4 key购买 nike

我正在将 R 函数转换为 Rcpp,其中我使用了 R 函数 rowSums ,这似乎不是 Rcpp 中的有效糖表达式。我找到了 Rcpp 版本的 rowSums 的代码 here .但我得到

error: use of undeclared identifier



当我使用 rowSumsC()在我的主要 Rcpp 函数中。

有没有简单的解决办法?

编辑:代码
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;
}")

最佳答案

Rcpp officially added rowSum support in 0.12.8 .因此,没有必要使用 rowSumsC Hadley 在 Advanced R 中设计的函数。

话虽如此,代码存在一些问题。

Rcpp 目前不支持 MatrixVectorMatrixMatrix计算。 (可以根据 #583 添加对后者的支持,但如果需要,应考虑使用 RcppArmadillo RcppEigen )。因此,以下行是有问题的:

w = w / rowSums(w)

为了解决这个问题,首先计算 rowSums然后使用传统的 for 对矩阵进行标准化环形。 注:与 R 不同,C++ 中的循环非常快。
NumericVector summed_by_row = rowSums(w);

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

接下来,C++ 索引从 0 开始不是 1 .因此,以下 for 循环是有问题的:
for (int i=1; i<k; ++i)

修复:
for (int i=0; i<k; ++i)

最后,可以减少函数的参数,因为某些值不相关或被覆盖。

函数声明来自:
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);

.....

将上述所有反馈放在一起,我们得到了所需的功能。
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)

输出
Before: 
0.0470993 0.125384
0.0285671 0.160996

rowSum: 0.172483 0.189563
After:
0.273066 0.661436
0.165623 0.849300

关于r - 如何在 rcpp 中计算 rowSums,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41947825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com