求矩阵中最大连通区域的大小

人气:73 发布:2023-01-03 标签: r matrix depth-first-search connected-components region

问题描述

所以我有一个矩阵(n行乘m列),希望找到具有最多连接的"1"的区域。例如,如果我有以下矩阵:

1 1 0 0
0 1 1 0
0 0 1 0
1 0 0 0

矩阵中有两个"1"区域。

第一区域:

1 1
  1 1
    1

第二区域:

1

我想创建一个将输出最大值=5的算法。我认为这与深度优先搜索有关,但我只有基本R和访问少数几个包的权限。

推荐答案

您可以使用SDMTools。首先,我们将矩阵转换为raster,然后检测clump个(补丁)的连通单元。每个束都有一个唯一的ID。NA和零被用作背景值。最后,PatchStat提供每个补丁的统计信息。

library(raster)
library(SDMTools)

r <- raster(mat)    
rc <- clump(r)
as.matrix(rc)
     [,1] [,2] [,3] [,4] [,5]
[1,]   NA    1    1    1    1
[2,]    1   NA   NA    1   NA
[3,]    1    1    1   NA    1
[4,]   NA   NA   NA   NA   NA
[5,]    2    2   NA   NA   NA
p <- PatchStat(rc)
max(p$n.cell)  

[1] 10

样本数据

set.seed(2)
m <- 5
n <- 5
mat <- round(matrix(runif(m * n), m, n))
mat
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    1    1    1
[2,]    1    0    0    1    0
[3,]    1    1    1    0    1
[4,]    0    0    0    0    0
[5,]    1    1    0    0    0

17