簡體   English   中英

高效創建矢量編碼,編碼另一個矢量的位置權重

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM