2013-06-02 15 views
5

ich von so etwas wie dies gehen wollen:Blockweise Summe von Matrixelementen

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 

Um so etwas wie dieses:

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

... ohne Verwendung von for-Schleifen, plyr oder auf andere Weise ohne Schleife. Möglich? Ich versuche, einen geografischen Lat/Long-Datensatz von 5 Bogenminuten auf einen halben Grad zu verkleinern, und ich habe ein ASCII-Raster. Eine kleine Funktion, bei der ich Blocksize spezifiziere, wäre großartig. Ich habe Hunderte von solchen Dateien, so dass Dinge, die es mir erlauben, es ohne Parallelisierung/Supercomputer schnell zu tun, sehr geschätzt werden.

Antwort

7

Sie können dafür Matrixmultiplikation verwenden.

# Computation matrix: 

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

Platz-Matrix verwendet beispielsweise eine Matrix und ihre Transponierte auf jeder Seite des 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 

Nicht-Quadrat Beispiel:

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

genau das, was ich gesucht habe für, danke! Meine Matrix ist nicht quadratisch, aber die Hälfte davon ist. –

0

Ich denke, das könnte Ihnen helfen, aber immer noch verwendet Sapply, die als Loop-ish-Tool betrachtet werden kann.

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 

Ist es irgendwie hilfreich?

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

I verwendet 1L und 2L statt 1 und 2 so Indizes ganze Zahlen bleiben (im Gegensatz zu Numerik Gegensatz) und es soll schneller auf diese Weise ausgeführt werden.