【问题标题】:Get neighbors of specified matrix element获取指定矩阵元素的邻居
【发布时间】:2014-02-28 04:58:37
【问题描述】:

假设我有以下矩阵:

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,但它们似乎处理整个矩阵,而我只想处理特定元素。

【问题讨论】:

标签: matlab matrix nearest-neighbor


【解决方案1】:

您可以使用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 了解更多信息。

【讨论】:

    【解决方案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))
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2012-10-04
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多