R 计算带矩阵列和的更快方法
我不熟悉R和stats。在我目前工作的领域中,我需要以一种独特的方式计算累计列和 最初,提供宽度为b且行数为n的方带矩阵。例如,对于n=8和b=3R 计算带矩阵列和的更快方法,r,matrix,R,Matrix,我不熟悉R和stats。在我目前工作的领域中,我需要以一种独特的方式计算累计列和 最初,提供宽度为b且行数为n的方带矩阵。例如,对于n=8和b=3 0 1 2 7 0 0 0 0 0 0 3 6 7 0 0 0 0 0 0 3 1 7 0 0 0 0 0 0 4 4 7 0 0 0 0 0 0 5 8 7 0 0 0 0 0 0 1 8 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 然后对矩阵进行变换,得到一个以对角线为列的nxb矩阵 1 2 7 3 6 7 3
0 1 2 7 0 0 0 0
0 0 3 6 7 0 0 0
0 0 0 3 1 7 0 0
0 0 0 0 4 4 7 0
0 0 0 0 0 5 8 7
0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 0
然后对矩阵进行变换,得到一个以对角线为列的nxb矩阵
1 2 7
3 6 7
3 1 7
4 4 7
5 8 7
1 8 0
4 0 0
0 0 0
1 2 7
4 8 14
7 9 21
11 13 28
16 21 35
17 29 35
21 29 35
21 29 35
我目前正在使用以下功能执行此操作
packedband <- function(x, n, b) {
mat <- sapply(0:(b-1), function(i)
diag(x[-(n:(n-i)), -(1:(1+i))])[1:n] )
mat[is.na(mat)] <- 0
return(mat)
}
我想要的是更快地计算这些操作,因为在给定的域中,列(或行)的数量可以大于10^5。可能可以删除计算packedband函数的步骤,因为最终目标是获得累计列和。
提前感谢。在处理了稀疏矩阵之后,我认为
for
循环在这里可能会很好地工作
试用原始数据
d = as.matrix(read.table(text="0 1 2 7 0 0 0 0
0 0 3 6 7 0 0 0
0 0 0 3 1 7 0 0
0 0 0 0 4 4 7 0
0 0 0 0 0 5 8 7
0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 0 "))
colnames(d) <- NULL
d=as.matrix(读表)(text=“0 1 2 7 0 0 0
0 0 3 6 7 0 0 0
0 0 0 3 1 7 0 0
0 0 0 0 4 4 7 0
0 0 0 0 0 5 8 7
0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 0 "))
colnames(d)在处理稀疏矩阵之后,我认为for
循环在这里可能会很好地工作
试用原始数据
d = as.matrix(read.table(text="0 1 2 7 0 0 0 0
0 0 3 6 7 0 0 0
0 0 0 3 1 7 0 0
0 0 0 0 4 4 7 0
0 0 0 0 0 5 8 7
0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 0 "))
colnames(d) <- NULL
d=as.matrix(读表)(text=“0 1 2 7 0 0 0
0 0 3 6 7 0 0 0
0 0 0 3 1 7 0 0
0 0 0 0 4 4 7 0
0 0 0 0 0 5 8 7
0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 0 "))
colnames(d)我不明白应该输出什么。如果只需要列和,请使用函数colSums()
?还有函数abandSparse(n,m=n,k,对角线,symmetric=FALSE,giveCsparse=TRUE)
@mktycolCumsums
不是基R函数。请提及函数所在的包的名称@Mislav与abandSparse相同。我已经修改了这个问题。请看一看。这里有一种方法可以组织列总和的矩阵<代码>库(矩阵);m=as(d,“矩阵”);m=sparseMatrix(i=m@i+1,j=m@j - m@i,x=m@x,dims=c(nrow(d),3))
(其中3为带宽硬编码),实际上这可能更快dd=cbind(d,矩阵(0,nrow=nrow(d),ncol=3));ro=序号(nrow(d));矩阵(dd[cbind(ro,ro+rep(1:3,各=nrow(dd))),ncol=3)
我不明白输出应该是什么。如果只需要列和,请使用函数colSums()
?还有函数abandSparse(n,m=n,k,对角线,symmetric=FALSE,giveCsparse=TRUE)
@mktycolCumsums
不是基R函数。请提及函数所在的包的名称@Mislav与abandSparse相同。我已经修改了这个问题。请看一看。这里有一种方法可以组织列总和的矩阵<代码>库(矩阵);m=as(d,“矩阵”);m=sparseMatrix(i=m@i+1,j=m@j - m@i,x=m@x,dims=c(nrow(d),3))
(其中3为带宽硬编码),实际上这可能更快dd=cbind(d,矩阵(0,nrow=nrow(d),ncol=3));ro=序号(nrow(d));矩阵(dd[cbind(ro,ro+rep(1:3,各=nrow(dd))),ncol=3)
这是一个很好的答案。非常感谢您的解决方案!这是一个很好的答案。非常感谢这个解决方案!
d = matrix(0, 5e3, 5e3)
d[(col(d) - row(d)) == 1] <- 1
d[(col(d) - row(d)) == 2] <- 1
d[ (col(d) - row(d)) == 3] <- 1
m <- as(d, "TsparseMatrix")
all.equal(forloop(d), packedband(d))
all.equal(spm(m), packedband(d))
microbenchmark::microbenchmark(packedband(d), forloop(d), spm(m), times=50)
# Unit: microseconds
# expr min lq mean median uq max neval cld
# packedband(d) 1348240.520 1724714.293 1740634.707 1733305.192 1763377.869 1960353.263 50 b
# forloop(d) 720.344 973.658 1054.461 1026.807 1174.731 1565.912 50 a
# spm(m) 2145.875 2437.321 2586.503 2480.133 2749.019 3766.051 50 a