我有一个分辨率为1,1的光栅图像。
我想将分辨率降低到4.4,但仍然具有构成新的4,4像素的像素的最大值。
我可以使用以下方法降低分辨率:
chm4 <- aggregate(chm, 4)
但是,这会为您提供构成此新像素的每个像素的平均最大值。
我尝试将栅格转换为矩阵,因此它采用以下形式:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]...
[1,] 63 34 45 76 21 54 35 45
[2,] 77 54 43 34 12 23 73 26
[3,] 56 73 26 27 81 29 34 52
[4,] 31 48 61 35 76 38 17 87
[5,] 16 24 71 45 58 60 14 35
[6,] 28 64 27 63 18 62 43 27
[7,] 27 48 76 27 54 61 52 44
[8,] 56 37 53 62 37 47 52 38
...
有没有办法计算所有值的最大值,例如,第1行到第4行以及第1列到第4列?
这也需要在整个矩阵中应用,其中有1000个行和列回到矩阵形式,如下所示:
[,1][,2]...
[1,] 77 87
[2,] 76 62
...
答案 0 :(得分:0)
您可以将矩阵转换为数组并使用apply
。如果您的数据不是很大,那么对于大多数应用来说,这应该足够快。
#the example data
M <- structure(c(63L, 77L, 56L, 31L, 16L, 28L, 27L, 56L, 34L, 54L,
73L, 48L, 24L, 64L, 48L, 37L, 45L, 43L, 26L, 61L, 71L, 27L, 76L,
53L, 76L, 34L, 27L, 35L, 45L, 63L, 27L, 62L, 21L, 12L, 81L, 76L,
58L, 18L, 54L, 37L, 54L, 23L, 29L, 38L, 60L, 62L, 61L, 47L, 35L,
73L, 34L, 17L, 14L, 43L, 52L, 52L, 45L, 26L, 52L, 87L, 35L, 27L,
44L, 38L), .Dim = c(8L, 8L), .Dimnames = list(NULL, NULL))
#create an array
A <- M
dim(A) <- c(2, nrow(M) / 2, 2, ncol(M) / 2)
#loop over the appropriate margins
apply(A, c(2, 4), max)
# [,1] [,2] [,3] [,4]
#[1,] 77 76 54 73
#[2,] 73 61 81 87
#[3,] 64 71 62 43
#[4,] 56 76 61 52
如果这太慢,那么为这个特定任务编写Rcpp函数会很容易。你只需要一个双循环。
答案 1 :(得分:0)
这是另一种可能性,在样本矩阵(mat)上使用for循环:
x <- sample(1:100, 100, replace = TRUE)
mat <- matrix(x, nrow = 10)
mat2 <- matrix(nrow = nrow(mat)/4, ncol = ncol(mat)/4)
for(i in 1:dim(mat2)[1]) {
for(j in 1:dim(mat2)[2]) {
row <- 4 * (i - 1) + 1
col <- 4 * (j - 1) + 1
mat2[i,j] <- max(mat[row:(row + 3), col:(col + 3)])
}
}