在 Rcpp 中查找最小值时忽略缺失值
Ignore missing values while finding min in Rcpp
我试图从 Rcpp 中的 2 个向量中找到 2 个值中的最小值。但以下不编译:
#include <cmath>
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector timesTwo(int time_length, double BXadd,
NumericVector vn_complete, NumericVector vn1_complete) {
// Empty vectors
NumericVector BX (time_length);
for(int t = 0; t < time_length; t++) {
BX[t] = BXadd * sqrt(std::min(na_omit(vn_complete[t], vn1_complete[t])));
}
return BX;
// return vn_complete[0];
}
Error 1 occurred building shared library.
如果我不使用 na_omit
,它会起作用。
运行 函数的 R 代码:
Rcpp::sourceCpp("test.cpp")
timesTwo(5, 2, 5:9, 1:5)
下面是一个有点荒谬的答案(因为它只适用于不包含 NA 的向量)但它具有您的代码所具有的所有组件,并且可以编译。
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector foo(int time_length, double BXadd,
NumericVector vn_complete, NumericVector vn1_complete) {
// Empty vectors
NumericVector BX (time_length);
vn_complete = na_omit(vn_complete);
vn1_complete = na_omit(vn1_complete);
for(int t = 0; t < time_length; t++) {
double a = vn_complete[t];
double b = vn1_complete[t];
BX[t] = BXadd * std::sqrt(std::min(a,b));
}
return BX;
}
// Edited version with new function added
// [[Rcpp::export]]
NumericVector foo2(double BXadd, NumericVector vn_complete,
NumericVector vn1_complete) {
return BXadd * sqrt(pmin(vn_complete, vn1_complete));
}
/*** R
foo(5, 2, 5:9, 1:5)
foo2(5, 2, 5:9, 1:5)
*/
对于真正的解决方案,您将不得不更深入地考虑去除 NA 应该做什么因为它也会改变向量的长度。所以这仍然需要工作。
最后,你的整个函数可以用 R 写成
2 * sqrt(pmin(5:9, 1:5))
而且我认为您也可以使用 Rcpp 糖来编写 相同的表达式,因为我们有 pmin()
和 sqrt()
:
// [[Rcpp::export]]
NumericVector foo2(double BXadd, NumericVector vn_complete,
NumericVector vn1_complete) {
return BXadd * sqrt(pmin(vn_complete, vn1_complete));
}
我试图从 Rcpp 中的 2 个向量中找到 2 个值中的最小值。但以下不编译:
#include <cmath>
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector timesTwo(int time_length, double BXadd,
NumericVector vn_complete, NumericVector vn1_complete) {
// Empty vectors
NumericVector BX (time_length);
for(int t = 0; t < time_length; t++) {
BX[t] = BXadd * sqrt(std::min(na_omit(vn_complete[t], vn1_complete[t])));
}
return BX;
// return vn_complete[0];
}
Error 1 occurred building shared library.
如果我不使用 na_omit
,它会起作用。
运行 函数的 R 代码:
Rcpp::sourceCpp("test.cpp")
timesTwo(5, 2, 5:9, 1:5)
下面是一个有点荒谬的答案(因为它只适用于不包含 NA 的向量)但它具有您的代码所具有的所有组件,并且可以编译。
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector foo(int time_length, double BXadd,
NumericVector vn_complete, NumericVector vn1_complete) {
// Empty vectors
NumericVector BX (time_length);
vn_complete = na_omit(vn_complete);
vn1_complete = na_omit(vn1_complete);
for(int t = 0; t < time_length; t++) {
double a = vn_complete[t];
double b = vn1_complete[t];
BX[t] = BXadd * std::sqrt(std::min(a,b));
}
return BX;
}
// Edited version with new function added
// [[Rcpp::export]]
NumericVector foo2(double BXadd, NumericVector vn_complete,
NumericVector vn1_complete) {
return BXadd * sqrt(pmin(vn_complete, vn1_complete));
}
/*** R
foo(5, 2, 5:9, 1:5)
foo2(5, 2, 5:9, 1:5)
*/
对于真正的解决方案,您将不得不更深入地考虑去除 NA 应该做什么因为它也会改变向量的长度。所以这仍然需要工作。
最后,你的整个函数可以用 R 写成
2 * sqrt(pmin(5:9, 1:5))
而且我认为您也可以使用 Rcpp 糖来编写 相同的表达式,因为我们有 pmin()
和 sqrt()
:
// [[Rcpp::export]]
NumericVector foo2(double BXadd, NumericVector vn_complete,
NumericVector vn1_complete) {
return BXadd * sqrt(pmin(vn_complete, vn1_complete));
}