2013-06-02 88 views
5

我想從東西是這樣的:列塊總和

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網格。我指定塊大小的一個小函數會很好。我已經有了數百個這樣的文件,所以讓我在沒有並行/超級計算機的情況下快速完成這些任務將非常感激。

回答

7

對此可以使用矩陣乘法。

# 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 
+0

正是諸如此類的事情,我一直在尋找謝謝!我的矩陣不是方形的,而是一半。 –

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 

它有幫助嗎?

4
tapply(a, list((row(a) + 1L) %/% 2L, (col(a) + 1L) %/% 2L), sum) 
# 1 2 
# 1 12 15 
# 2 10 16 

我以前1L2L代替12所以指數保持整數(而不是數字),它應該運行得更快的方式。