我有一个简单的矩阵:
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
...
有什么想法吗?
答案 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是一种语言(认为它是一个类的缩写)。我下次会仔细检查。