R中1s和-1s的滤波器向量
我想对以下向量应用几个过滤器:R中1s和-1s的滤波器向量,r,for-loop,vectorization,R,For Loop,Vectorization,我想对以下向量应用几个过滤器: v <-c(1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1
v <-c(1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1-1,1,1,1)
v您可以轻松地将其转换为Rcpp:
#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
IntegerVector myfilter(IntegerVector x){
对于(int i=1;i<(x.size()-1);i++){
如果(x(i-1)=-1&&x(i+1)=-1&&x(i)==1){
x(i)=-1;
}
}
对于(int i=2;i<(x.size()-1);i++){
如果(x(i-2)=-1&&x(i-1)=1&&x(i+1)=-1&&x(i)==1){
x(i)=-1;
x(i-1)=-1;
}
}
返回x;
}
在R中测试它:
t1例如t[t==1]您的循环正在原地修改数据。他们可能没有完全按照您的预期进行操作……您是否可以添加一个示例,说明for循环与粘贴的矢量化解决方案不匹配?对于您提供的向量,第一个For循环的输出与向量化解决方案完全匹配。西蒙:我已经把它改成了v,t1和t2詹姆斯:这就是他的想法,在下面的循环步骤中使用一组元素的变化约瑟伯:你是对的,我仍然在努力培养良好的习惯。我在问题的末尾添加了一个完整的例子谢谢你罗兰!我花了一段时间才明白你写的代码是C++,这真是个好主意!我尝试应用代码,但首先需要了解Rcpp和C++基础知识(这对我的项目有很大帮助)
v <-c(1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1-1,1,1,1)
t1 <- v
t2 <- v
for (i in 2:(length(t1)-1)) {
if (t1[i-1]==-1 & t1[i+1]==-1 & t1[i]==1){
t1[i] <- -1
}
}
for (i in 2:(length(t1)-1)) {
if (t1[i-1]==1 & t1[i+1]==1 & t1[i]==-1){
t1[i] <- 1
}
}
for (i in 3:(length(t1)-1)) {
if (t1[i-2]==-1 & t1[i+1]==-1 & t1[i]==1 & t1[i-1] ==1) {
t1[i] <- -1
t1[i-1] <- -1
}
}
for (i in 3:(length(t1)-1)) {
if (t1[i-2]==1 & t1[i+1]==1 & t1[i]==-1 & t1[i-1] ==-1) {
t1[i] <- 1
t1[i-1] <- 1
}
}
for (i in 4:(length(t1)-1)) {
if (t1[i-3]==-1 & t1[i+1]==-1 & t1[i-2]==1 & t1[i-1] ==1 & t1[i] ==1) {
t1[i-2] <- -1
t1[i-1] <- -1
t1[i] <- -1
}
}
for (i in 4:(length(t1)-1)) {
if (t1[i-3]==1 & t1[i+1]==1 & t1[i-2]==-1 & t1[i-1] ==-1 & t1[i] ==-1) {
t1[i-2] <- 1
t1[i-1] <- 1
t1[i] <- 1
}
}
for (i in 5:(length(t1)-1)) {
if (t1[i-4]==-1 & t1[i+1]==-1 & t1[i-3]==1 & t1[i-2]==1 & t1[i-1] ==1 & t1[i] ==1) {
t1[i-3] <- -1
t1[i-2] <- -1
t1[i-1] <- -1
t1[i] <- -1
}
}
for (i in 5:(length(t1)-1)) {
if (t1[i-4]==1 & t1[i+1]==1 & t1[i-3]==-1 & t1[i-2]==-1 & t1[i-1] ==-1 & t1[i] ==-1) {
t1[i-3] <- 1
t1[i-2] <- 1
t1[i-1] <- 1
t1[i] <- 1
}
}
t2 <- paste(v, collapse="")
t2 <- gsub("-11-1", "-1-1-1", t2)
t2 <- gsub("1-11", "111", t2)
t2 <- gsub("-111-1", "-1-1-1-1", t2)
t2 <- gsub("1-1-11", "1111", t2)
t2 <- gsub("-1111-1", "-1-1-1-1-1", t2)
t2 <- gsub("1-1-1-11", "11111", t2)
t2 <- gsub("-11111-1", "-1-1-1-1-1-1", t2)
t2 <- gsub("1-1-1-1-11", "111111", t2)
t2 <-as.integer(strsplit(t2, "(?<=\\d)", perl = TRUE)[[1]])
all.equal(t1, t2)