求R中矩阵与向量相乘行和的最快方法
我有3个向量求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(
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