r-矩阵元素的块和



我想从这样的东西开始:

1> a = matrix(c(1,4,2,5,2,5,2,1,4,4,3,2,1,6,7,4),4)
1> a
     [,1] [,2] [,3] [,4]
[1,]    1    2    4    1
[2,]    4    5    4    6
[3,]    2    2    3    7
[4,]    5    1    2    4

类似的东西:

     [,1] [,2]
[1,]   12   15
[2,]   10   16

不使用for loops、plyr或其他不使用loop的方法。可能的我正试图将地理纬度/经度数据集从5弧分缩小到半度,我得到了一个ascii网格。一个我指定块大小的小函数会很棒。我有数百个这样的文件,所以如果能让我在没有并行化/超级计算机的情况下快速完成,我将不胜感激。

您可以使用矩阵乘法。

# Computation matrix:
mat <- function(n, r) {
  suppressWarnings(matrix(c(rep(1, r), rep(0, n)), n, n/r))
}

方形矩阵示例,使用a:每侧的矩阵及其转置

# Reduce a 4x4 matrix by a factor of 2:
x <- mat(4, 2)
x
##      [,1] [,2]
## [1,]    1    0
## [2,]    1    0
## [3,]    0    1
## [4,]    0    1
t(x) %*% a %*% x
##      [,1] [,2]
## [1,]   12   15
## [2,]   10   16

非正方形示例:

b <- matrix(1:24, 4 ,6)
t(mat(4, 2)) %*% b %*% mat(6, 2)
##      [,1] [,2] [,3]
## [1,]   14   46   78
## [2,]   22   54   86
tapply(a, list((row(a) + 1L) %/% 2L, (col(a) + 1L) %/% 2L), sum)
#    1  2
# 1 12 15
# 2 10 16

我使用了1L2L而不是12,所以索引保持整数(与数字相反(,这样它应该运行得更快。

我想这可能会对你有所帮助,但它仍然使用sapply,这可以被视为循环工具。

a <- matrix(c(1,4,2,5,2,5,2,1,4,4,3,2,1,6,7,4),4)
block.step <- 2
res <- sapply(seq(1, nrow(a), by=block.step), function(x) 
    sapply(seq(1, nrow(a), by=block.step), function(y) 
        sum(a[x:(x+block.step-1), y:(y+block.step-1)])
    )
)
res

它到底有用吗?

相关内容

  • 没有找到相关文章

最新更新