假设我有以下矩阵:
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近邻。
例如,如果我想要空间邻域为5x5的3,3近邻,函数将返回整个矩阵,而3x3邻域将返回7 6 8 7 6 5 8 7 6。
我可以用行和列直接索引来实现这一点,但是随着邻居的扩大,这就变得不切实际了。有更快的方法吗?我看过一些过滤器,比如nlfilter和colfilter,但是它们似乎处理了整个矩阵,而我只想处理一个特定的元素。
发布于 2014-02-28 06:36:25
忽略边缘条件这是下标索引的一个简单例子:
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。
发布于 2014-02-28 05:28:42
您可以使用这种方法提取子矩阵,也可以制作偏移掩码,以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有关更多信息,请访问这里。
https://stackoverflow.com/questions/22086610
复制相似问题