如何用 size = n 的变量移动寡妇中的最大值替换矩阵中的每个元素?
How to replace every element in a matrix with the maximum of the values within a variable moving widow of size = n?
所以本质上,我想要做的是用 window 中由该单元格中的值确定的最大相邻单元格替换矩阵中的每个元素。
window 大小将由以下函数确定:'fitlwr'(下图),其中 Tree_Height 调用适合树高和树冠直径数据集的线性模型数据:
RoundOdd <- function(x) {2*floor(x/2)+1} #makes sure window size is an odd number
fitlwr <- function(x){for(i in x){
if(i > 13){
m <- RoundOdd(Tree_Heights[Tree_Heights$Tree_Height == i, "fit.lwr"])
return(matrix(1, nrow = m, ncol = m))
}
else {
return(matrix(1, 3, 3))
}
}}
然后我想用 window 中的最大值替换该矩阵中的每个值,栅格焦点函数是我的首选,但它们不允许您使用变量 window尺寸。
矩阵源自栅格图层,值表示给定像元的地面以上高度。尺寸为 6,571 x 5,764。一部分数据可能如下所示:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 9 47 103 58 80 55 72 56 14 52
[2,] 68 49 49 43 62 80 62 23 55 82
[3,] 58 10 79 70 75 49 68 60 74 79
[4,] 78 19 51 26 61 77 57 70 51 43
[5,] 47 88 57 80 25 33 24 30 56 63
[6,] 73 36 53 25 63 30 19 59 17 63
[7,] 95 9 49 95 6 13 21 75 60 34
[8,] 36 65 47 64 22 66 52 9 71 20
[9,] 45 53 31 47 114 55 44 42 44 44
[10,] 47 23 102 34 67 60 5 23 61 32
对于一个vector,可以按如下方式进行:
说,
x = c(1,3,2,1,4,2)
y = x # copy the vector
N=2 # window size, you can set any number you want.
for (i in 1:length(x)){
y[i] = max(x[i-N:i+N])
}
结果是
> y
[1] 3 3 3 3 4 4
对于矩阵,
有点复杂,
假设 X 是,
X = matrix(sample(100, 36), ncol=6)
> X
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 9 72 17 62 41 47
[2,] 18 33 61 30 16 35
[3,] 38 96 37 60 13 70
[4,] 4 44 69 78 80 90
[5,] 39 81 65 24 28 11
[6,] 73 75 25 98 64 100
您可以按如下方式解决:
Y=X # copy the matrix
N=2 # any window size
for (i in 1:nrow(X)){
for (j in 1:ncol(X)){
Y[i,j] = max( X[ max(1,i-N):min(nrow(X),i+N), max(1,j-N):min(ncol(X),j+N)] )
}
}
结果是
> Y
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 96 96 96 96 70 70
[2,] 96 96 96 96 90 90
[3,] 96 96 96 96 90 90
[4,] 96 98 98 100 100 100
[5,] 96 98 98 100 100 100
[6,] 81 98 98 100 100 100
谢谢 Ibilgen,您的解决方案奏效了,我对其进行了一些修改,以最大程度地进行圆周移动 window。
这是一个矩形移动window:
Y <- X
for (i in 1:nrow(X)){
for (j in 1:ncol(X)){
N <- fitlwr(X[i,j])
Y[i,j] = max(X[max(1, i-N):min(nrow(X), i+N), max(1, j-N):min(ncol(X), j+N)])
}
}
fitlwr() #是一个自定义函数,它调用一个线性模型,该模型将单元格的值与移动的预期半径相匹配window
这里是循环移动window:
Y <- X
for (i in 1:nrow(X)){
for (j in 1:ncol(X)){
N = fitlwr(X[i,j])
M = X[max(1, i-N):min(nrow(X), i+N), max(1, j-N):min(ncol(X), j+N)]
W = reshape2::melt(M)
W$d2 = sqrt((W$Var1-mean(W$Var1))^2 + (W$Var2-mean(W$Var2))^2)
Y[i,j] = max(X[i,j], max(subset(W, d2 <= N, select = value)))}
}
所以本质上,我想要做的是用 window 中由该单元格中的值确定的最大相邻单元格替换矩阵中的每个元素。
window 大小将由以下函数确定:'fitlwr'(下图),其中 Tree_Height 调用适合树高和树冠直径数据集的线性模型数据:
RoundOdd <- function(x) {2*floor(x/2)+1} #makes sure window size is an odd number
fitlwr <- function(x){for(i in x){
if(i > 13){
m <- RoundOdd(Tree_Heights[Tree_Heights$Tree_Height == i, "fit.lwr"])
return(matrix(1, nrow = m, ncol = m))
}
else {
return(matrix(1, 3, 3))
}
}}
然后我想用 window 中的最大值替换该矩阵中的每个值,栅格焦点函数是我的首选,但它们不允许您使用变量 window尺寸。
矩阵源自栅格图层,值表示给定像元的地面以上高度。尺寸为 6,571 x 5,764。一部分数据可能如下所示:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 9 47 103 58 80 55 72 56 14 52
[2,] 68 49 49 43 62 80 62 23 55 82
[3,] 58 10 79 70 75 49 68 60 74 79
[4,] 78 19 51 26 61 77 57 70 51 43
[5,] 47 88 57 80 25 33 24 30 56 63
[6,] 73 36 53 25 63 30 19 59 17 63
[7,] 95 9 49 95 6 13 21 75 60 34
[8,] 36 65 47 64 22 66 52 9 71 20
[9,] 45 53 31 47 114 55 44 42 44 44
[10,] 47 23 102 34 67 60 5 23 61 32
对于一个vector,可以按如下方式进行:
说,
x = c(1,3,2,1,4,2)
y = x # copy the vector
N=2 # window size, you can set any number you want.
for (i in 1:length(x)){
y[i] = max(x[i-N:i+N])
}
结果是
> y
[1] 3 3 3 3 4 4
对于矩阵,
有点复杂, 假设 X 是,
X = matrix(sample(100, 36), ncol=6)
> X
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 9 72 17 62 41 47
[2,] 18 33 61 30 16 35
[3,] 38 96 37 60 13 70
[4,] 4 44 69 78 80 90
[5,] 39 81 65 24 28 11
[6,] 73 75 25 98 64 100
您可以按如下方式解决:
Y=X # copy the matrix
N=2 # any window size
for (i in 1:nrow(X)){
for (j in 1:ncol(X)){
Y[i,j] = max( X[ max(1,i-N):min(nrow(X),i+N), max(1,j-N):min(ncol(X),j+N)] )
}
}
结果是
> Y
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 96 96 96 96 70 70
[2,] 96 96 96 96 90 90
[3,] 96 96 96 96 90 90
[4,] 96 98 98 100 100 100
[5,] 96 98 98 100 100 100
[6,] 81 98 98 100 100 100
谢谢 Ibilgen,您的解决方案奏效了,我对其进行了一些修改,以最大程度地进行圆周移动 window。
这是一个矩形移动window:
Y <- X
for (i in 1:nrow(X)){
for (j in 1:ncol(X)){
N <- fitlwr(X[i,j])
Y[i,j] = max(X[max(1, i-N):min(nrow(X), i+N), max(1, j-N):min(ncol(X), j+N)])
}
}
fitlwr() #是一个自定义函数,它调用一个线性模型,该模型将单元格的值与移动的预期半径相匹配window
这里是循环移动window:
Y <- X
for (i in 1:nrow(X)){
for (j in 1:ncol(X)){
N = fitlwr(X[i,j])
M = X[max(1, i-N):min(nrow(X), i+N), max(1, j-N):min(ncol(X), j+N)]
W = reshape2::melt(M)
W$d2 = sqrt((W$Var1-mean(W$Var1))^2 + (W$Var2-mean(W$Var2))^2)
Y[i,j] = max(X[i,j], max(subset(W, d2 <= N, select = value)))}
}