matlab在矩阵上得到邻居

时间:2014-05-21 22:20:14

标签: arrays matlab matrix nearest-neighbor

我有一个简单的矩阵:

1  2  3  4
5  6  7  8
8  9  10 11
12 13 14 15

我需要遍历每个元素并构建一个包含3个周围元素的新矩阵(右边一个,右下角和底部一个)。所以我最终得到一个像这样的数组:

1  2  6  5
2  3  7  6
3  4  8  7

我设法做到了这一点,但当我需要跳到下面的那一行时,我似乎无法弄清楚如何去做。对于下一行应该是:

5  6  9  8
6  7  10 9 
...

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

[m n] = size(A);
[jj ii] = ndgrid(1:m-1, 1:n-1); %// rows and columns except last ones
kk = sub2ind([m n], ii(:),jj(:)); %// to linear index
B = [ A(kk) A(kk+m) A(kk+m+1) A(kk+1) ] %// pick desired values with linear index

在你的例子中:

B =
     1     2     6     5
     2     3     7     6
     3     4     8     7
     5     6     9     8
     6     7    10     9
     7     8    11    10
     8     9    13    12
     9    10    14    13
    10    11    15    14

答案 1 :(得分:1)

我最喜欢的bsxfun在这里工作 -

[M,N] = size(A); %// A is Input
ind =  bsxfun(@plus,[1:M-1],[(0:N-2).*M]') %//'
out = A(bsxfun(@plus,ind(:),[0 M M+1 1]))  %// Desired output

使用问题的样本输入输出 -

out =
     1     2     6     5
     2     3     7     6
     3     4     8     7
     5     6     9     8
     6     7    10     9
     7     8    11    10
     8     9    13    12
     9    10    14    13
    10    11    15    14

答案 2 :(得分:0)

我不知道您编写的语言是什么,因此我只使用通用布局:

int[][] getNeighbors(int[][] source){
    int arrayX = int[0].Length;
    int arrayY = int.Length;

    int[][] output = new int[arrayX-1*arrayY-1][4];

    for(int y = 0; y < arrayY; y++){
        for(int x = 0; x < arrayX; x++){
            output[y+x][x] = source[y][x];
            output[y+x][x+1] = source[y][x+1];
            output[y+x][x+2] = source[y+1][x+1];
            output[y+x][x+3] = source[y+1][x];
        }
    }

    return output;
}

请原谅我的数组语法。我不想尝试使用任何特定语言编写代码。我也确定这包含错误。随意纠正我的答案。 :)

编辑:不知道matlab是一种语言(认为它是一个类的缩写)。我下次会仔细检查。