Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算带矩阵列和的更快方法_R_Matrix - Fatal编程技术网

R 计算带矩阵列和的更快方法

R 计算带矩阵列和的更快方法,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

我不熟悉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 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)
@mkty
colCumsums
不是基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)
@mkty
colCumsums
不是基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