在矩阵+ matlab中找到距离为d的邻居

时间:2012-03-09 13:59:36

标签: matlab

我想要一个点坐标的所有邻居在距离它的距离为d的矩阵中以及该点。

生成这样一个子矩阵的最有效方法是什么?

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

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

同时如果矩阵中不存在索引,则此时我应该得到0。

因此对于data point 2 and d = 1,答案为[ 0 , 0 , 0 ; 1 , 2 ,3 ; 4 , 5 , 6]

我该怎么做?

3 个答案:

答案 0 :(得分:0)

这是一个解决方案。我会让你把它变成一个功能。让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表达式返回多个位置,这仍然无法应对。

我仍然不保证这个效率。

答案 1 :(得分:0)

首先说明你在A的情况,而不是给d=0data_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)

编辑:修复了两个,没有三个错误,并使其成为一个函数

答案 2 :(得分:0)

试试这个......

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 )

我希望它有效......没有真正检查!!