我想要一个点坐标的所有邻居在距离它的距离为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]
我该怎么做?
答案 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=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)
编辑:修复了两个,没有三个错误,并使其成为一个函数
答案 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 )
我希望它有效......没有真正检查!!