[英]Efficient create vector encoding summed position-weight of another vector
假設我有一個向量v
並想創建另一個向量p
編碼的各位置中的求和位置重量相同長度的v
(在0為0的v
)。 例如,對於v = c(0,1,3,0,1)我得到p = c(0,2,11,0,16)。 換句話說, p
的第i個元素(不為0)變為v [i] * i加p
的前一個元素(不為0)。
我想出了一種方法,但是它看起來很丑陋,我擔心它的時間/內存效率不是很高-我需要在巨大的向量上執行此操作。 有什么要改進的想法嗎?
fun <- function(v){
res <- NULL
s = 0
for(i in 1:length(v)){
ifelse(v[i] == 0, res[i] <- 0, {res[i] <- v[i]*i + s; s <- res[i]})
}
return(res)
}
接着:
> fun(c(0,1,3,0,1))
[1] 0 2 11 0 16
更新:
如何反轉此函數的輸出,即從c(0,2,11,0,16)返回c(0,1,3,0,1)?
一種方法是在將向量乘以位置編號的同時獲得v
的累加和。 零將保持不變,其余的將正確計算。 最后,我們可以將向量乘以1和0的轉換向量,以實質上強制轉換必要的零值:
cumsum(v*seq_along(v))*+(!!v)
[1] 0 2 11 0 16
為了提高可讀性,我們還可以寫出:
cumsum(v * seq_along(v)) * as.integer(as.logical(v))
更新
嘗試逆轉:
w <- as.logical(r)
r[w] <- c(r[w][1], diff(r[w]))
r / seq_along(r)
[1] 0 1 3 0 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.