首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取指定矩阵元素的邻域

获取指定矩阵元素的邻域
EN

Stack Overflow用户
提问于 2014-02-28 04:58:37
回答 2查看 4.6K关注 0票数 1

假设我有以下矩阵:

代码语言:javascript
运行
复制
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,但是它们似乎处理了整个矩阵,而我只想处理一个特定的元素。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-28 06:36:25

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

代码语言:javascript
运行
复制
r = 3;
c = 3;
n = 4;

M = magic(10);

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

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

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2014-02-28 05:28:42

您可以使用这种方法提取子矩阵,也可以制作偏移掩码,以3x3邻居为例:

代码语言:javascript
运行
复制
s=size(yourmatrix);
N=length(s);
[c1{1:N}]=ndgrid(1:3);
c2(1:N)={2};
offsets=sub2ind(s,c1{:}) - sub2ind(s,c2{:})

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

代码语言:javascript
运行
复制
neighbors = yourmatrix(L+offsets)

它不会在矩阵的边上工作,但是你可以先填充边来处理它。

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

代码语言:javascript
运行
复制
yourmatrix =
   1     6    11    16
   2     7    12    17
   3     8    13    18
   4     9    14    19
   5    10    15    20

当您在这个小示例上运行我的代码时,您应该

代码语言:javascript
运行
复制
offsets =
-6    -1     4
-5     0     5
-4     1     6

所以,如果我想让邻里以"14“为中心,我会

代码语言:javascript
运行
复制
>> yourmatrix(14+offsets)
ans =
     8    13    18
     9    14    19
    10    15    20

有关更多信息,请访问这里

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22086610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档