求R中矩阵与向量相乘行和的最快方法

求R中矩阵与向量相乘行和的最快方法,r,R,我有3个向量v,w和a。我想找出指示符(v>w_I)*a_I的总和。有没有比下面的代码更快的方法 v = rnorm(1600) w = runif(500) a = rnorm(500) m = v > rep(w, each = length(v)) dim(m)=c(length(v), length(w)) . system.time({ m = v > rep(w, each = length(v)) dim(m)=c(length(v), length(

我有3个向量
v
w
a
。我想找出指示符
(v>w_I)*a_I的总和。
有没有比下面的代码更快的方法

v = rnorm(1600)
w = runif(500)
a = rnorm(500)
m = v > rep(w, each = length(v))
dim(m)=c(length(v), length(w))

. system.time({
    m = v > rep(w, each = length(v))
    dim(m)=c(length(v), length(w))
    rowSums(m %*% diag(a))
  })
   user  system elapsed 
  0.03    0.00    0.04 

即使是非矢量化的解决方案也比像您使用
diag
那样设置一个巨大的稀疏矩阵要快

system.time(
  res<-sapply(v,function(v1)sum(a[v1>w]))
) 
#   user  system elapsed 
#  0.032   0.000   0.031

system.time({
  m = v > rep(w, each = length(v))
  dim(m)=c(length(v), length(w))
  res<-rowSums(m %*% diag(a))
})
#  user  system elapsed 
# 0.364   0.000   0.362 
system.time(
resw]))
) 
#用户系统运行时间
#  0.032   0.000   0.031
系统时间({
m=v>rep(w,每个=长度(v))
尺寸(m)=c(长度(v),长度(w))

res你打算用额外的4秒做什么?我认为这更适合代码审查。也许如果你描述了你想要的(不仅仅是一堵代码墙)。指标总和(v>w_I)*a_I
fancy<-function(){
  order.w<-order(w)
  cumsum.a<-c(0,cumsum(a[order.w]))
  cumsum.a[findInterval(v,c(-Inf,w[order.w]))]
}
system.time(res2<-fancy())
#   user  system elapsed 
#  0       0       0 
all.equal(res,res2)
# TRUE