矩阵元素的逐块和

gen*_*ser 7 r matrix linear-algebra vectorization

我想从这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

对于这样的事情:

     [,1] [,2]
[1,]   12   15
[2,]   10   16
Run Code Online (Sandbox Code Playgroud)

...不使用for循环,plyr或其他没有循环.可能?我正在尝试将地理纬度/经度数据集从5弧分缩小到半度,我有一个ascii网格.我指定blocksize的一个小函数会很棒.我有数百个这样的文件,所以让我能够快速完成而没有并行化/超级计算机的东西将非常感激.

Mat*_*erg 9

您可以使用矩阵乘法.

# Computation matrix:

mat <- function(n, r) {
  suppressWarnings(matrix(c(rep(1, r), rep(0, n)), n, n/r))
}
Run Code Online (Sandbox Code Playgroud)

方矩阵示例,在每一侧使用矩阵及其转置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
Run Code Online (Sandbox Code Playgroud)

非方形示例:

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
Run Code Online (Sandbox Code Playgroud)


flo*_*del 5

tapply(a, list((row(a) + 1L) %/% 2L, (col(a) + 1L) %/% 2L), sum)
#    1  2
# 1 12 15
# 2 10 16
Run Code Online (Sandbox Code Playgroud)

我曾经1L2L代替1,并2因此指数仍然整数(而不是数字),它应该运行得更快的方式.