选择一个点的邻域并将其转换为向量

Posted

技术标签:

【中文标题】选择一个点的邻域并将其转换为向量【英文标题】:select a neighborhood of points and convert it to a vector 【发布时间】:2016-05-26 18:46:55 【问题描述】:

我的数据实际上是 256 x 256 矩阵形式的图像。我想。然后应用一些聚类算法。我是 R 新手,需要一些代码帮助。我创建了一个玩具数据集来展示我想要做什么。

d<- matrix(rbinom(8*8,1,0.5),8,8)
d
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    0    1    0    0    0    0    1
[2,]    1    1    1    0    1    1    1    1
[3,]    1    1    1    1    0    1    1    1
[4,]    0    0    1    1    1    1    1    0
[5,]    0    0    1    0    0    1    1    1
[6,]    1    0    0    0    0    0    1    0
[7,]    0    0    1    1    0    1    1    0
[8,]    1    1    0    1    1    0    1    0

从点 d[2,2] 开始,我想选择它周围 8 个点的邻域并将其转换为向量。所以对于 d[2,2] 这些点将是前 3 个 d[1,1],d[1,2],d[1,3],相邻的左侧 d[2,1] 相邻的右侧 d[2,3 ] 和底部 3 d[3,1]、d[3,2] 和 d[3,3]。如下所示:

     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    1    1    1
[3,]    1    1    1

现在将其转换为 R^9 中的向量 v1=(0,0,1,1,1,1,1,1,1)。然后,我想对不在矩阵边界上的所有点(即第一行和最后一行以及第一列和最后一列)执行此操作。我不知道如何继续,并会感谢任何帮助。提前致谢。

【问题讨论】:

【参考方案1】:

您可以继续使用嵌套的for 循环:

ddim <- dim(d) - 1
vect <- list()
for(i in seq(ddim[1])[-1]) 
    for(j in seq(ddim[2])[-1]) 
        vect <- c(vect, list(c(d[(i-1):(i+1), (j-1):(j+1)])))
    

可能有优化的解决方案(嵌套的 for 循环不好),但如果您没有太多数据负担,这很有效。

【讨论】:

谢谢。但我想将 vect 存储在矩阵中。我该怎么做? 你可以加do.call(cbind, vect)

以上是关于选择一个点的邻域并将其转换为向量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 STL 获取结构向量并将其转换为结构元素的向量

根据属性过滤数据(data.frame)并将其分配给向量

Randomizer 从向量中选择一个数字并将其删除

MATLAB 向量化:计算邻域矩阵

将向量合并为 df,并将向量名称转换为新列的行

如何选择 JSON 的特定部分并将其转换为使用 Moshi 改造的列表