获取指定矩阵元素的邻居

时间:2014-02-28 04:58:37

标签: matlab matrix nearest-neighbor

说我有以下矩阵:

1   6   7   8   9
3   7   6   8   9
8   7   6   5   0
2   8   7   6   5
2   9   6   8   2

我想找到矩阵

中特定元素的k-最近邻居

因此,例如,如果我想要[3,3]的最近邻居,空间邻域为5x5,则函数将返回整个矩阵,并且3x3邻域将返回[7 6 8 7 6 5 8 7 6]

我可以通过行和列的直接索引来实现这一点,但随着邻域变大,这变得不切实际。有更快的方法吗?我查看了一些像nlfilter和colfilter这样的过滤器,但它们似乎处理整个矩阵,而我只想处理一个特定的元素。

2 个答案:

答案 0 :(得分:4)

您可以使用this method从中提取子矩阵或制作偏移掩码,以3x3个邻居为例:

s=size(yourmatrix);
N=length(s);
[c1{1:N}]=ndgrid(1:3);
c2(1:N)={2};
offsets=sub2ind(s,c1{:}) - sub2ind(s,c2{:})

现在,对于矩阵L中的任何线性索引,您可以通过

获取所有邻居
neighbors = yourmatrix(L+offsets)

它不会在矩阵的边缘起作用,但你可以先填充边缘来处理它。


我认为你需要一个例子来看看这个方法在做什么。假设你的矩阵是

yourmatrix =
   1     6    11    16
   2     7    12    17
   3     8    13    18
   4     9    14    19
   5    10    15    20

当你在这个小例子上运行我的代码时,你应该获得

offsets =
-6    -1     4
-5     0     5
-4     1     6

所以,现在,如果我想要以“14”为中心,我会做

>> yourmatrix(14+offsets)
ans =
     8    13    18
     9    14    19
    10    15    20

查看here了解详情。

答案 1 :(得分:2)

忽略边缘条件这是一个简单的下标索引案例:

r = 3;
c = 3;
n = 4;

M = magic(10);

sub = M((r-n):(r+n), (c-n):(c+n))

其中r是您的目标点行号,c是列号,n是邻域大小。这对边缘情况有用,但我们可以这样处理:

sub = M(max((r-n), 1):min((r+n), end), max((c-n),1):min((c+n),end))

如果不是从行r-n开始,而不是1,而是从r-n1的较大者开始。然后,要停止越过末尾,只需选择r+nend中的较小者。