【问题标题】:Find size of maximum connected region in matrix查找矩阵中最大连通区域的大小
【发布时间】:2018-04-14 07:01:22
【问题描述】:

所以我有一个矩阵(n 行 x m 列)并且想要找到连接最多的“1”的区域。例如,如果我有以下矩阵:

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

矩阵中有2个“1”区域。

第一个区域:

1 1
  1 1
    1

第二个地区:

1

我想创建一个输出最大值 = 5 的算法。我认为这与深度优先搜索有关,但我只有基本 R 并且可以访问几个包。

【问题讨论】:

    标签: r matrix depth-first-search region connected-components


    【解决方案1】:

    您可以使用SDMTools。首先,我们将矩阵转换为raster,然后我们检测连接单元的clumps(补丁)。每个丛都有一个唯一的 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
    

    【讨论】:

    • 这是一种性感的方式。即使丛听起来不那么性感。在 R 中有这么多!可悲的是,我想这样做而不需要那些包,或者最真的。有任何想法吗?我的意思是显然我尝试了一个包含每个连接的 1 的列表。但这就是我所得到的。
    • 如果你想从头开始计算,你可以深入研究clump函数(github.com/cran/raster/blob/master/R/clump.R)的源代码。但它使用来自rasterigraph 包的adjacentclusters...
    • 没错,我知道 igraph 在这里很重要。哦,好吧,我会坚持下去并尝试一些技巧。我的意思是我可以得到最接近列表中每个 1 的所有元素,非常简单。现在我只需将该列表合并到包含唯一连接点的单独向量中。嗯...但是感谢您的意见!
    • 原来 igraph 可用。 raster 是我们的失败 :(
    • 完美。奇迹般有效。只需要一点平滑即可解释!
    【解决方案2】:

    我最终使用igraph

    library(igraph)
    data<-scan("stdin")
    n<-data[1]
    m<-data[2]
    
    mat<-matrix(data[3:(n*m+2)],nrow=n,ncol=m,byrow=TRUE)
    labels <- as.vector(mat)
    rows <- (seq(length(labels)) - 1) %% nrow(mat)
    cols <- ceiling(seq(length(labels)) / nrow(mat))
    g <- graph.lattice(dim(mat), nei=2)
    
    # Remove edges between elements of different types or that aren't diagonal
    edgelist <- get.edgelist(g)
    retain <- labels[edgelist[,1]] == labels[edgelist[,2]] &
      abs(rows[edgelist[,1]] - rows[edgelist[,2]]) <= 1 &
      abs(cols[edgelist[,1]] - cols[edgelist[,2]]) <= 1
    g <- delete.edges(g, E(g)[!retain])
    
    y<-clusters(g)$membership ### clustered matrix as vector
    m<-as.vector(mat) ### original matrix 
    z<-y[m>0] ### ignore where original matrix is 0
    cat(sort(table(z),decreasing=TRUE)[[1]])
    

    【讨论】:

      猜你喜欢
      • 2015-12-20
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 2012-04-16
      相关资源
      最近更新 更多