rya*_*yan 4 r matrix multiplication
我有一个长向量x,另一个v,包含长度.我想总结x,以便答案y是长度的矢量length(v),并且y[1]是sum(x[1:v[i]]),y[2]是sum(x[(1+v[1]):(v[1]+v[2])]),等等.本质上,这是执行从维度空间到维度length(x)之一的稀疏矩阵乘法length(v).但是,我宁愿不引进"先进机械",尽管我可能不得不这样做.它需要非常非常快.任何人都可以想到比使用稀疏矩阵包更简单的东西吗?
示例 -
x <- c(1,1,3,4,5)
v <- c(2,3)
y <- myFunc(x,v)
Run Code Online (Sandbox Code Playgroud)
y 应该 c(2,12)
我对任何预处理持开放态度 - 例如,在v中存储每个拉伸的起始索引.
y <- cumsum(x)[cumsum(v)]
y <- c(y[1], diff(y))
Run Code Online (Sandbox Code Playgroud)
这看起来像它做额外的工作,因为它的计算整个向量cumsum,但它实际上比其他解决方案快到目前为止,团体的小型和大型数字.
这是我模拟数据的方式
set.seed(5)
N <- 1e6
n <- 10
x <- round(runif(N,0,100),1)
v <- as.vector(table(sample(n, N, replace=TRUE)))
Run Code Online (Sandbox Code Playgroud)
在我的机器上,时间n <- 10是:
改变n <- 1e5时间是:
我怀疑这比使用矩阵乘法更快,即使使用稀疏矩阵包,因为没有必要形成矩阵或进行任何乘法.如果需要更快的速度,我怀疑它可以通过用C写入来加快速度; inline和rcpp包裹一起不难做,但我会把它留给你.