r - 在矩阵中识别 "clusters"或 "groups"

标签 r image-processing matrix cluster-computing

我有一个填充有离散元素的矩阵,我需要将它们聚集成完整的组。因此,例如,以这个矩阵为例:

[A B B C A]
[A A B A A]
[A B B C C]
[A A A A A]

A 有两个独立的集群,C 有两个独立的集群,B 有一个集群。

我正在寻找的输出理想情况下会为每个集群分配一个唯一的 ID,如下所示:
[1 2 2 3 4]
[1 1 2 4 4]
[1 2 2 5 5]
[1 1 1 1 1]

现在我有一个 R 代码,它通过迭代检查最近邻来递归地执行此操作,但是当矩阵变大(即 100x100)时它会迅速溢出。

R 中是否有内置函数可以执行此操作?我研究了光栅和图像处理,但没有运气。我相信它一定在那里。

谢谢!

最佳答案

您可以通过构建表示矩阵的点阵图来解决此问题,其中只有在顶点具有相同类型时才会保留边:

# Build initial matrix and lattice graph
library(igraph)
mat <- matrix(c(1, 1, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 3, 1, 3, 1, 1, 1, 3, 1), nrow=4)
labels <- as.vector(mat)
g <- graph.lattice(dim(mat))
lyt <- layout.auto(g)

# Remove edges between elements of different types
edgelist <- get.edgelist(g)
retain <- labels[edgelist[,1]] == labels[edgelist[,2]]
g <- delete.edges(g, E(g)[!retain])

# Take a look at what we have
plot(g, layout=lyt)

enter image description here

顶点按列编号。很容易看出,我们需要做的就是获取这个图的组件:
matrix(clusters(g)$membership, nrow=nrow(mat))
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    2    2    3    4
# [2,]    1    1    2    4    4
# [3,]    1    2    2    5    5
# [4,]    1    1    1    1    1

如果您想在晶格中包含对角线,您可以从邻域大小为 2 的晶格开始,然后限制为相隔不超过一行或一列的元素。考虑以下矩阵:
[A B C B]
[B A A A]

由于包含对角链接,以下代码将捕获 4 个组,而不是 6 个:
# Build initial matrix and lattice graph (neighborhood size 2)
mat <- matrix(c(1, 2, 2, 1, 3, 1, 2, 1), nrow=2)
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])

# Cluster to obtain final groups
matrix(clusters(g)$membership, nrow=nrow(mat))
#      [,1] [,2] [,3] [,4]
# [1,]    1    2    3    4
# [2,]    2    1    1    1

关于r - 在矩阵中识别 "clusters"或 "groups",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24455620/

相关文章:

c++ - CUDA c++,简单的矩阵乘法错误

matlab - 3D 矩阵切片的 2D 卷积

r - R 数据框中的十个最高列值

r - 如何轻松地将多个向量组合成一个数据框?

r - 在 R 中,ggplot geom_point() 具有基于特定离散值的颜色 - 第 2 部分

matlab - 在循环期间将数字保存在 matlab 中

python - OpenCV在不良图像上使用各种方法绘制轮廓

r - 将向量转换为列表,向量中的每个元素作为列表中的元素

python - 获取图像中矩形的数量

r - R 中的 3D 矩阵乘法