2016-03-17 58 views
0

我有一個實際上是256 x 256矩陣形式的圖像的數據。我想寫一個函數叫做「get.nbhd」,它爲一個像素選擇4個鄰居並將其存儲爲一個向量。然後在需要時調用該函數。如果像素是角落或邊界,則分別有2個和3個鄰居。這是一個玩具數據集。因此,對於任何中間像素,如d [i,j],這4個鄰居將是{d [i-1,j],d [i + 1,j],d [i,j + 1],d [i ,J-1]}。對於4個角像素,2鄰域將是{d [i,j-1],[i + 1,j]},{d [i,j + 1],d [i + 1,j] {d [i-1,j],d [i,j-1]},{d [i-1,j],d [i,j + 1]}。頂部和底部邊界像素將具有{d [i-1,j],[i + 1,j],d [i,j-1]}的3個鄰居。任何幫助表示讚賞。在R中獲取鄰居函數

> x<- matrix(rbinom(8*8,1,0.5),8,8) 
    > x 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
    [1,] 1 1 1 0 1 0 1 0 
    [2,] 1 1 0 1 0 1 1 1 
    [3,] 1 1 1 1 1 0 0 0 
    [4,] 1 1 1 0 1 1 1 1 
    [5,] 1 1 1 1 0 1 0 0 
    [6,] 1 1 1 0 0 1 1 1 
    [7,] 0 1 1 1 1 0 0 0 
    [8,] 0 1 0 0 0 1 1 0 

回答

2

此功能使您的m[i, j]鄰居的向量:

get.nbhd <- function(m, i, j) { 
    # get indices 
    idx <- matrix(c(i-1, i+1, i, i, j, j, j+1, j-1), ncol = 2) 
    # set out of bound indices to 0 
    idx[idx[, 1] > nrow(m), 1] <- 0 
    idx[idx[, 2] > ncol(m), 2] <- 0 
    return (x[idx]) 
} 

使用零作爲索引不會給一個錯誤的事實功能利潤,只是沒有返回值。因此,太大的指數設置爲零。

作爲一個例子,我使用了一個不同的矩陣,因爲檢查結果的正確性並不容易,如果只有一個和零。

x<- matrix(1:25,5,5) 
x 
##  [,1] [,2] [,3] [,4] [,5] 
## [1,] 1 6 11 16 21 
## [2,] 2 7 12 17 22 
## [3,] 3 8 13 18 23 
## [4,] 4 9 14 19 24 
## [5,] 5 10 15 20 25 
get.nbhd(x, 2, 3) 
## [1] 11 13 17 7 
get.nbhd(x, 1, 5) 
## [1] 22 16 
get.nbhd(x, 5, 3) 
## [1] 14 20 10 
+0

非常感謝!這有很大幫助。還有一個問題。我如何修改這個函數來提取鄰居的索引而不是實際的值。當我開始編碼時,我意識到我還需要另一個返回鄰域索引的函數。例如,對於點d [1,1],該函數將d [1,2]和d [2,1]作爲鄰居索引。如果它不合適,我可以將它作爲另一個問題發佈。 – user24318

+0

指數是在函數的第一行計算的。由此,您需要刪除具有無效索引的行。 (在函數中,我只將無效索引設置爲零,但您可能希望完全刪除它們。)如果這不足以幫助您,我認爲最好提出一個新問題。不要忘記首先在SO和Google上尋找有用的答案! – Stibu

+0

謝謝。我能夠通過刪除零行來修改你的函數! – user24318