在matrix+matlab中查找距离d处的邻居

在matrix+matlab中查找距离d处的邻居,matlab,Matlab,我想要一个矩阵中一个点坐标的所有邻域,与该点的距离为d 生成此类子矩阵的最有效方法是什么 例如,如果A=[1,2,3;4,5,6;7,8,9] 然后对于d=0和数据5,我将得到答案为5,但对于d=1,我将得到矩阵A作为结果,因为A本身的大小是3X3 同时,如果索引在矩阵中不存在,那么我应该得到0 对于数据点2和d=1,答案是[0,0,0;1,2,3;4,5,6] 我该怎么做呢?这里有一个解决方案。我让你把它变成一个函数。让n表示子数组中心的值,在示例中为5 z = zeros(size(A,1)

我想要一个矩阵中一个点坐标的所有邻域,与该点的距离为d

生成此类子矩阵的最有效方法是什么

例如,如果A=[1,2,3;4,5,6;7,8,9]

然后对于d=0和数据5,我将得到答案为5,但对于d=1,我将得到矩阵A作为结果,因为A本身的大小是3X3

同时,如果索引在矩阵中不存在,那么我应该得到0

对于数据点2和d=1,答案是[0,0,0;1,2,3;4,5,6]


我该怎么做呢?

这里有一个解决方案。我让你把它变成一个函数。让n表示子数组中心的值,在示例中为5

z = zeros(size(A,1)+2*d,size(A,2)+2*d);
z(d+1:d+size(A,1),d+1:d+size(A,2)) = A;
[r,c] = find(z==n);
z(r-d:r+d,c-d:c+d)
编辑

试试这个版本,它和我以前的尝试一样没有经过充分的测试。如果find表达式返回多个位置,这仍然无法处理


我仍然不保证这一点的效率。

首先,如果你在A中,而不是给出d=0和data_point=5,你应该给出data_point=[2,2]。如果你给它5,你可以通过

ij = [ceil(data_point/size(A,1)), rem(data_point-1, size(A,1))+1]
或者使用find,比如High的答案,这取决于如何解释你的问题

以下函数

function B = find_neigh(A,ij,d)
imin = max(ij(1)-d,1);
imax = min(ij(1)+d,size(A,1));
jmin = max(ij(2)-d,1);
jmax = min(ij(2)+d,size(A,2));
B = zeros(2*d+1,2*d+1);
r1 = max(2-ij(1)+d,1);
c1 = max(2-ij(2)+d,1);
B(r1:r1+imax-imin, c1:c1+jmax-jmin) = A(imin:imax,jmin:jmax);
应该返回您想要的结果。例如,用

A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
find_neigh(A,[1,2],1)
编辑:修复了两个,没有三个错误,并使其成为一个函数

A = padarray( A , [d d] )
% assuming the data is at r row and c col do the following

A( r : r + 2d , c : c + 2 d )

我希望它能起作用。。。没有真正检查

案例n=2,d=1,=>r=1给出r-d=0=>0子索引不正确。。。我可以假设我知道r,c,但它仍然给了我关于邻域的错误答案。我取了下面的矩阵‘A=[1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16]’,并给出了r=2和c=2,d=1。。。它返回我'0;0 1 2 ; 0 5 6’那么,现在就交给你来修复我的产品或@KYS的。你是说关于我的修复,还是你发现了一个错误?不@KYS,写了你原来的帖子,我根本没有测试过你的代码。哎呀,我几乎没试过我的。你能举个有效的例子吗?我可以把它当作数据(我知道数据点在哪里)。。。。不幸的是,@High-Performance-Mark给出的答案不起作用……好吧,我现在把代码放到一个函数中,并给出了一个如何调用它的示例。将函数另存为find_neigh.m。玩得高兴倍频程不知道焊盘阵列:-但如果它工作得如此紧凑,那就很好了