我编写了以下代码来从向量中删除零。我使用 Rcpp 库中的
erase(i)
函数。
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector erase_zero(NumericVector x) {
for (int i = 0; i < x.size(); i++) {
if (x[i] == 0) {
x.erase(i);
}
}
return x;
}
一切都很好,现在问题是函数的输出,即
> erase_zero(c(0,1,2,3,0))
[1] 1 2 3
> erase_zero(c(0,0,1,2,3,0,0))
[1] 0 1 2 3 0
> erase_zero(c(0,0,0,1,2,3,0,0,0))
[1] 0 1 2 3 0
> erase_zero(c(0,0,0,0,1,2,3,0,0,0,0))
[1] 0 0 1 2 3 0 0
我不知道为什么会这样。
erase
改变向量的大小。这给出了预期的输出。
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector erase_zero(NumericVector x) {
R_xlen_t n = x.size();
for (R_xlen_t i = 0; i < n; i++) {
if (x[i] == 0) {
x.erase(i);
i--;
n--;
}
}
return x;
}
/*** R
erase_zero(c(0,1,2,3,0))
erase_zero(c(0,0,1,2,3,0,0))
erase_zero(c(0,0,0,1,2,3,0,0,0))
erase_zero(c(0,0,0,0,1,2,3,0,0,0,0))
*/
但是,你应该只使用一些 Rcpp 糖。效率更高:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector erase_zero_sugar(NumericVector x) {
return x[x != 0];
}
您还应该阅读为什么这些数字不相等。