说我有以下矩阵:
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这样的过滤器,但它们似乎处理整个矩阵,而我只想处理一个特定的元素。
答案 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-n
或1
的较大者开始。然后,要停止越过末尾,只需选择r+n
或end
中的较小者。