NA
RcppEigen で実装されている関数内のベクトルから効率的に値を削除する必要があります。もちろんfor
ループでもできますが、もっと効率の良い方法はないかと。
次に例を示します。
library(RcppEigen)
library(inline)
incl <- '
using Eigen::Map;
using Eigen::VectorXd;
typedef Map<VectorXd> MapVecd;
'
body <- '
const MapVecd x(as<MapVecd>(xx)), y(as<MapVecd>(yy));
VectorXd x1(x), y1(y);
int k(0);
for (int i = 0; i < x.rows(); ++i) {
if (x.coeff(i)==x.coeff(i) && y.coeff(i)==y.coeff(i)) {
x1(k) = x.coeff(i);
y1(k) = y.coeff(i);
k++;
};
};
x1.conservativeResize(k);
y1.conservativeResize(k);
return Rcpp::List::create(Rcpp::Named("x") = x1,
Rcpp::Named("y") = y1);
'
na.omit.cpp <- cxxfunction(signature(xx = "Vector", yy= "Vector"),
body, "RcppEigen", incl)
na.omit.cpp(c(1.5, NaN, 7, NA), c(7.0, 1, NA, 3))
#$x
#[1] 1.5
#
#$y
#[1] 7
私の使用例では、これをループ (Rcpp 関数内) で約 100 万回行う必要があり、ベクトルは非常に長くなる可能性があります (1000 要素と仮定しましょう)。
PS: を使用してすべてのNA
/NaN
値を検索するルートも調査しましx.array()==x.array()
たが、Eigen でサブセット化するために結果を使用する方法を見つけることができませんでした。