给出如下矩阵:
m = matrix(c(c(0,0,0,0,0,1,1,1,0,0),
c(0,0,1,0,0,0,0,1,0,0),
c(0,1,0,1,1,1,0,0,0,0),
c(0,1,0,0,0,1,0,1,0,0),
c(0,0,1,0,0,1,0,1,0,0),
c(0,0,1,1,1,1,0,1,0,0),
c(0,0,1,1,1,0,0,1,0,0),
c(0,0,0,0,0,0,0,0,0,0)), ncol = 10, byrow = T)
我可能会以某种方式应用一维split
函数。例如:对于第[1]行
0 1 1 0 0 1 1 1 0 0
split(row[1])
= [1 1 1], [1 1]
,因为我将零作为剪切和修剪值。因此,在我的数组示例中,我希望得到3个较小的矩阵:
M 1
a = matrix(c(c(0,1,0,0,0),
c(1,0,1,1,1),
c(1,0,0,0,1),
c(0,1,0,0,1),
c(0,1,1,1,1),
c(0,1,1,1,0)), ncol = 5, byrow = T)
M 2
b = matrix(c(c(1,1,1),
c(0,0,1)), ncol = 3, byrow = T)
M 3
c = matrix(c(c(1),
c(1),
c(1),
c(1)), ncol = 1, byrow = T)
如果我没记错的话。这是实现它的一些简单方法吗?我现在使用R(但可能是Python)进行编码。基本上,我可以将其用于1D,但在2D中,由于行依赖列,因此变得棘手。顺便说一句,我需要保存原始位置的坐标。
编辑 我已将输入编辑为可复制的。我的栅格解决方案很受欢迎:如何保留坐标或原始矩阵? 也就是说,原始矩阵中每个新矩阵的行和列ID。
答案 0 :(得分:2)
我不确定我是否100%理解,但这是一个光栅解决方案。首先,我创建矩阵。
# Create matrix
mat <- as.matrix(read.table(text = "0 0 0 0 0 1 1 1 0 0
0 0 1 0 0 0 0 1 0 0
0 1 0 1 1 1 0 0 0 0
0 1 0 0 0 1 0 1 0 0
0 0 1 0 0 1 0 1 0 0
0 0 1 1 1 1 0 1 0 0
0 0 1 1 1 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0"))
然后,我加载raster
库并将矩阵转换为栅格。
# Load raster library
library(raster)
#> Loading required package: sp
# Convert to raster
ras <- raster(mat)
在这里,我发现成群的细胞。
# Create clumps including diagonals
clu <- clump(ras, directions = 8)
#> Loading required namespace: igraph
此功能提取每个团块。
# Extract & trim clumps, then turn NAs to zeros
clumpy <- function(x){
tmp <- as.matrix(trim(match(clu, x)))
tmp[is.na(tmp)] <- 0
tmp
}
在这里,我将函数应用于所有块。
lapply(unique(clu), clumpy)
#> [[1]]
#> [,1] [,2] [,3]
#> [1,] 1 1 1
#> [2,] 0 0 1
#>
#> [[2]]
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 0 1 0 0 0
#> [2,] 1 0 1 1 1
#> [3,] 1 0 0 0 1
#> [4,] 0 1 0 0 1
#> [5,] 0 1 1 1 1
#> [6,] 0 1 1 1 0
#>
#> [[3]]
#> [,1]
#> [1,] 1
#> [2,] 1
#> [3,] 1
#> [4,] 1
由reprex package(v0.3.0)于2019-06-12创建
这是clumpy
的版本,其中保留行号和列号。
# Extract & trim clumps, then turn NAs to zeros
clumpy <- function(x){
# Find clump
foo <- as.matrix(match(clu, x))
# Rename columns & rows
colnames(foo) <- 1:ncol(foo)
rownames(foo) <- 1:nrow(foo)
# Trim
tmp <- as.matrix(trim(foo))
# Replace NAs with zeros
tmp[is.na(tmp)] <- 0
# Return matrix
tmp
}
# [[1]]
# 6 7 8
# 1 1 1 1
# 2 0 0 1
#
# [[2]]
# 2 3 4 5 6
# 2 0 1 0 0 0
# 3 1 0 1 1 1
# 4 1 0 0 0 1
# 5 0 1 0 0 1
# 6 0 1 1 1 1
# 7 0 1 1 1 0
#
# [[3]]
# 8
# 4 1
# 5 1
# 6 1
# 7 1