2013-06-02 39 views
5

Tôi muốn đi từ một cái gì đó như thế này:Blockwise cộng các yếu tố ma trận

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 

Để một cái gì đó như thế này:

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

... mà không sử dụng cho-vòng, plyr, hoặc bằng cách khác mà không vòng lặp. Khả thi? Tôi đang cố gắng thu nhỏ một tập dữ liệu vĩ độ/địa lý dài từ 5 arc-phút đến nửa độ, và tôi có một lưới ascii. Một chức năng nhỏ mà tôi chỉ định khối sẽ là tuyệt vời. Tôi đã có hàng trăm tệp như vậy, vì vậy mọi thứ cho phép tôi làm điều đó một cách nhanh chóng mà không cần sự đồng bộ hóa/siêu máy tính sẽ được đánh giá cao.

Trả lời

7

Bạn có thể sử dụng phép nhân ma trận cho việc này.

# Computation matrix: 

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

Square-ma trận Ví dụ, sử dụng một ma trận và chuyển vị của nó trên mỗi bên của 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 

Non-square dụ:

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

chính xác loại điều tôi đang tìm kiếm cho, cảm ơn! ma trận của tôi không phải là hình vuông, nhưng một nửa của nó là. –

0

Tôi đoán rằng có thể giúp bạn, nhưng nó vẫn sử dụng một cách dễ dàng mà có thể được coi là công cụ vòng lặp ish.

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 

Có cách nào hữu ích không?

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

tôi đã sử dụng 1L2L thay vì 12 nên chỉ số vẫn còn nguyên (như trái ngược với numerics) và nó sẽ chạy nhanh hơn theo cách đó.

Các vấn đề liên quan