Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 求矩阵中最大连通区域的大小_R_Matrix_Depth First Search_Region_Connected Components - Fatal编程技术网

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

R 求矩阵中最大连通区域的大小,r,matrix,depth-first-search,region,connected-components,R,Matrix,Depth First Search,Region,Connected Components,所以我有一个矩阵(n行x m列),我想找到最连通的“1s”区域。例如,如果我有以下矩阵: 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。首先,我们将矩阵转换为光栅,然后检测连接单元的块。每个束都有一个唯一的ID。NA和零用作背景值。最后,PatchStat提供每

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

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
。首先,我们将矩阵转换为光栅,然后检测连接单元的块。每个束都有一个唯一的ID。NA和零用作背景值。最后,
PatchStat
提供每个补丁的统计信息

library(raster)
library(SDMTools)

r <- raster(mat)    
rc <- clump(r)
as.matrix(rc)

我最终使用了
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]])
库(igraph)

这是一种性感的方式。即使“丛”听起来不那么性感。在R里有这么多!可悲的是,我想这样做,而不需要这些软件包,或是最真的。有什么想法吗?我的意思是,很明显,我是用一个包含每个连接的1的列表来尝试的。但这就是我所能得到的。如果你想从头开始计算它,你可以深入研究
clump
function()的源代码。但是它使用了
相邻的
集群
,它们来自
光栅
igraph
包……没错,我知道igraph在这里很重要。哦,好吧,我会坚持下去,尝试一些技巧。我的意思是我可以得到列表中最接近每个1的所有元素,非常简单。现在我只需要将该列表合并到包含唯一连接点的单独向量中。隐马尔可夫模型。。。但谢谢你的意见!原来igraph是可用的<代码>光栅
是我们的失败:(完美。工作起来很有魅力。只需要稍微平滑一下即可解释!
p <- PatchStat(rc)
max(p$n.cell)  
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
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]])