R 如何用size=n的变量中的最大值替换矩阵中的每个元素?
所以本质上,我想做的是用窗口内相邻单元格的最大值替换矩阵中的每个元素,该值由该单元格中的值决定 窗口大小将由以下函数确定:“fitlwr”(如下),其中Tree_Height调用适合树高和树冠直径数据集的线性模型:R 如何用size=n的变量中的最大值替换矩阵中的每个元素?,r,matrix,raster,nearest-neighbor,sp,R,Matrix,Raster,Nearest Neighbor,Sp,所以本质上,我想做的是用窗口内相邻单元格的最大值替换矩阵中的每个元素,该值由该单元格中的值决定 窗口大小将由以下函数确定:“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){
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))
}
}}
对于向量,可以按如下方式执行: 说 结果是
> y
[1] 3 3 3 3 4 4
> 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
对于矩阵,
这有点复杂,
假设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] 3 3 3 3 4 4
> 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,您的解决方案奏效了,我对其进行了轻微修改,以最大限度地利用圆形移动窗口 这适用于矩形移动窗口:
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)])
}
}
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)))}
}
Y是否替换矩阵或向量中的每个元素?你能举一个你的X的例子吗?@ibilgen如上所述,我添加了一个例子,我想替换矩阵中的每个值。谢谢你,但是我如何将相同的方法应用于矩阵?窗口大小是二维的吗?如果你觉得我的答案有用,请投上一票。很高兴这有帮助。