【问题标题】:find neighbours at distance d in matrix + matlab在矩阵+ matlab中找到距离d处的邻居
【发布时间】:2012-03-10 02:30:50
【问题描述】:

我希望矩阵中一个点坐标的所有邻居都与该点相距 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]

我该怎么做?

【问题讨论】:

    标签: matlab


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

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

    【讨论】:

    • octave 不知道 padarray :-( 但如果它工作得这么紧凑那就太好了
    【解决方案2】:

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

    我仍然不保证这样做的效率。

    【讨论】:

    • case n=2,d=1, (=> r=1) 给出 r-d=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 0 ; 0 1 2 ; 0 5 6'
    • 那么,现在由你来解决我的产品或 @Kyss 的问题。
    【解决方案3】:

    从你在 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)
    

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

    【讨论】:

    • 您的意思是关于我的修复,还是您又发现了一个错误?
    • 不@Kyss,写你原来的帖子,我根本没有测试你的代码。克里基,我几乎没有测试过我的。
    • 你能举个例子吗?我可以将它作为数据 [2] [2] 即我知道数据点在哪里......不幸的是,@ High Performance Mark 给出的答案没有工作......
    • 好的,我现在把代码放到一个函数中,并举例说明如何调用它。将函数另存为 find_neigh.m。玩得开心!
    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多