【发布时间】:2019-03-24 05:23:13
【问题描述】:
我有一个矩阵 M(比如 r 行和 c 列),我想根据每个矩阵元素的邻居获得“加权”总和并创建一个新矩阵 M2。邻居一词可能在半径 1 内(在元胞自动机理论中通常称为摩尔邻域),或者半径可能与 1 不同,例如 2、3 等。
对于矩阵 M 中的特定单元格,请说在中间的某处。假设位置(i,j);那么第(i,j)个单元格有“八个”邻居,
(i-1, j-1), (i-1, j), (i-1, j+1), (i, j-1), (i, j+1), (i+1, j-1), (i+1, j), (i+1, j+1).
我想创建一个矩阵 M2 来计算第 (i,j) 个单元格加上其八个相邻单元格的“加权”和。加权是基于单元之间的欧几里得距离进行的。比如,
exp(-sqrt(2))*M[i-1,j-1] + exp(-1)*M[i-1,j] + exp(-sqrt(2))*M[i-1,j+1] + exp(-1)*M[i,j-1] + M[i,j] + exp(-1)*M[i,j+1] + exp(-sqrt(2))*M[i+1,j-1] + exp(-1)*M[i+1,j] + exp(-sqrt(2))*M[i+1,j+1]
对所有单元重复相同的想法(沿边界的单元需要特殊处理,因为它们不一定有八个相邻单元)。上面的想法适用于半径 1,但我正在尝试开发的代码需要对任何半径都是通用的。
r <- 4
c <- 4
n <- r*c
(M <- matrix(1:n, r, c))
addresses <- expand.grid(x = 1:r, y = 1:c)
#Got this code in the same forum
z <- rbind(c(-1,0,1,-1,1,-1,0,1),c(-1,-1,-1,0,0,1,1,1))
get.neighbors <- function(rw) {
# Convert to absolute addresses
z2 <- t(z + unlist(rw))
# Choose those with indices within mat
b.good <- rowSums(z2 > 0)==2 & z2[,1] <= nrow(M) & z2[,2] <= ncol(M)
M[z2[b.good,]]
}
apply(addresses,1 , get.neighbors) # Returns a list with neighbors
M
本质上,半径 = 1 的 M2 必须是当前单元格加上相邻单元格的“加权”总和。当前当前单元格的权重始终为 1。
M = [ 1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16]
M2 = [ 5.033 13.803 .... ....
.... .... .... ....
.... .... .... ....
.... .... .... ....]
如何在 R 中获取矩阵 M2?如果半径大于1怎么办?我希望加权发生在两个 for 循环内,因此我可以在关闭两个 for 循环的代码中进一步使用计算得出的 [i,j] 单元格的加权和。
【问题讨论】:
-
请不要永远在问题中发布的代码中包含
rm(list=ls())。这类似于建议某人运行您的代码,其中包含旧的format C:\DOS 命令。 -
谢谢 r2evans。我会记住以后永远不要包含
rm(list=ls())。
标签: r for-loop matrix nearest-neighbor adjacency-matrix