我写了下面的代码来从向量中删除零。我使用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
型
我不知道为什么会这样。
在阅读了下面所有的答案后,我简单地尝试了一下速度测试
> microbenchmark(erase_zero(s), erase_zero1(s), erase_zero_sugar(s))
Unit: microseconds
expr min lq mean median uq max neval
erase_zero(s) 19.311 21.2790 22.54262 22.181 22.8780 35.342 100
erase_zero1(s) 18.573 21.0945 21.95222 21.771 22.4680 36.490 100
erase_zero_sugar(s) 1.968 2.0910 2.57070 2.296 2.5215 24.887 100
型erase_zero1
是罗兰的第一个代码。而且,RumasIsCoding的R基础比所有的代码都更高效。
3条答案
按热度按时间xggvc2p61#
erase
改变向量的大小。这给出了预期的输出。字符串
然而,你应该只使用一些Rcpp糖。它更有效:
型
你也应该读Why are these numbers not equal。
n9vozmp42#
提交
erase
时,x
的大小会动态变化。字符串
输出示例
型
你会看到
型
evrscar23#
这里是一个基准测试,有一堆
Rcpp
方法与基本R子集,你会看到基本R方法x[x!= 0]
已经是最有效的了。Rcpp代码
字符串
用于比较的代码
型
输出
型