移动内核中两个矩阵中的最小单元格
Minimum of cells in two matrices within a moving kernel
我有两个矩阵 m1
和 m2
。
m1 <- matrix(1:16, ncol = 4)
m2 <- matrix(16:1, ncol = 4)
# > m1
# [,1] [,2] [,3] [,4]
# [1,] 1 5 9 13
# [2,] 2 6 10 14
# [3,] 3 7 11 15
# [4,] 4 8 12 16
# > m2
# [,1] [,2] [,3] [,4]
# [1,] 16 12 8 4
# [2,] 15 11 7 3
# [3,] 14 10 6 2
# [4,] 13 9 5 1
我想为 3x3 的移动内核中的每个单元格找到两个矩阵之间的最小值。应该忽略外边距,即它们可以用 NAs
填充,然后 min
函数应该有 na.rm = TRUE
。结果应如下所示:
# > m3
# [,1] [,2] [,3] [,4]
# [1,] 1 1 3 3
# [2,] 1 1 2 2
# [3,] 2 2 1 1
# [4,] 3 3 1 1
我已经尝试过 pmin{base}
和 runmin{caTools}
的组合,如下所示:
pmin(runmin(m1, 3, endrule = "keep"),
runmin(m2, 3, endrule = "keep"))
但是,这没有用。可能是因为
"If x is a matrix than each column will be processed separately."
(from ?runmin
)
是否有执行此类操作的软件包,或者是否可以 apply
?
这是一个基础 R
方法:
m = pmin(m1, m2)
grid = expand.grid(seq(nrow(m)), seq(ncol(m)))
x = apply(grid, 1, function(u) {
min(m[max(1,u[1]-1):min(nrow(m), u[1]+1), max(1,u[2]-1):min(ncol(m), u[2]+1)])
})
dim(x) = dim(m)
#> x
# [,1] [,2] [,3] [,4]
#[1,] 1 1 3 3
#[2,] 1 1 2 2
#[3,] 2 2 1 1
#[4,] 3 3 1 1
我有两个矩阵 m1
和 m2
。
m1 <- matrix(1:16, ncol = 4)
m2 <- matrix(16:1, ncol = 4)
# > m1
# [,1] [,2] [,3] [,4]
# [1,] 1 5 9 13
# [2,] 2 6 10 14
# [3,] 3 7 11 15
# [4,] 4 8 12 16
# > m2
# [,1] [,2] [,3] [,4]
# [1,] 16 12 8 4
# [2,] 15 11 7 3
# [3,] 14 10 6 2
# [4,] 13 9 5 1
我想为 3x3 的移动内核中的每个单元格找到两个矩阵之间的最小值。应该忽略外边距,即它们可以用 NAs
填充,然后 min
函数应该有 na.rm = TRUE
。结果应如下所示:
# > m3
# [,1] [,2] [,3] [,4]
# [1,] 1 1 3 3
# [2,] 1 1 2 2
# [3,] 2 2 1 1
# [4,] 3 3 1 1
我已经尝试过 pmin{base}
和 runmin{caTools}
的组合,如下所示:
pmin(runmin(m1, 3, endrule = "keep"),
runmin(m2, 3, endrule = "keep"))
但是,这没有用。可能是因为
"If x is a matrix than each column will be processed separately." (from
?runmin
)
是否有执行此类操作的软件包,或者是否可以 apply
?
这是一个基础 R
方法:
m = pmin(m1, m2)
grid = expand.grid(seq(nrow(m)), seq(ncol(m)))
x = apply(grid, 1, function(u) {
min(m[max(1,u[1]-1):min(nrow(m), u[1]+1), max(1,u[2]-1):min(ncol(m), u[2]+1)])
})
dim(x) = dim(m)
#> x
# [,1] [,2] [,3] [,4]
#[1,] 1 1 3 3
#[2,] 1 1 2 2
#[3,] 2 2 1 1
#[4,] 3 3 1 1