2014-05-21 146 views
3

鄰居我有一個簡單的矩陣:MATLAB得到矩陣

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

你跳過最後一列和最後一行的原始矩陣,對不對? –

+0

是的就是這樣,我不需要那 – DianaLog

回答

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 
+0

正是我所需要的,謝謝! – DianaLog

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是一種語言(認爲這是一個類的縮寫)。下次我會更仔細地檢查。

+0

歡迎來到SO!語言是MATLAB,通過檢查問題上的標籤可以看到......如果OP在問題中列出它,仍然會很好... – darthbith

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