我想从这样的事情出发:
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循环,plyr或其他没有循环。可能?我正在尝试将地理纬度/经度数据集从5弧分缩小到半度,我有一个ascii网格。我指定blocksize的一个小函数会很棒。我有数百个这样的文件,所以我可以非常感谢那些让我快速完成而无需并行化/超级计算机的文件。
答案 0 :(得分:9)
您可以使用矩阵乘法。
# 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
答案 1 :(得分:5)
tapply(a, list((row(a) + 1L) %/% 2L, (col(a) + 1L) %/% 2L), sum)
# 1 2
# 1 12 15
# 2 10 16
我使用1L
和2L
代替1
和2
,因此索引保持整数(与数字相反),它应该以这种方式运行得更快。
答案 2 :(得分:0)
我想这可能对你有所帮助,但它仍然使用了可以被视为循环工具的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
无论如何有用吗?