2017-06-21 7 views
1

行列の各要素の最近傍点(3 * 3移動ウィンドウ)の標準偏差を計算したいと思います。行列の各要素の最近傍の標準偏差を計算する効率的な方法

library(FNN)  
df <- matrix(1:10000, nrow = 100, ncol = 100, byrow = TRUE) 

df_ <- reshape2::melt(df) 
df_index <- df_[, c(1,2)] 

df_query <- df_index 
neighbor_index <- knnx.index(df_index, df_query, k = 9, algorithm = 'kd_tree') 

neighbor_coor<- apply(neighbor_index, 1, function(x) df_query[x, ]) 

neighbor_sd <- lapply(neighbor_coor, function(x) sd(df[x[, 1], x[, 2]])) 

sd <- do.call(rbind, neighbor_sd) 

しかし、速度が遅すぎる:私はそれを実装するためにRにいくつかのコードを書きました。あなたは私にスピードアップのアドバイスをくれますか?それを実装する他の方法はありますか?

+2

私はdata.table'これを解決するための雷が 'あります確信しているが、あなたは'と考えられていますラスタパッケージ?多分それはいくつかの助けの可能性があります。 https://stackoverflow.com/questions/24068509/r-focal-raster-package-function-that-c​​alculates-relative-to-center-cell-of-mov –

+0

ありがとうございます!短いコードを書いてみませんか?私はそれを答えとして受け入れます。 –

答えて

1

@romanlustrikさんのコメントで提案されているように、raster::focal()をこの問題に使用できます。

wは(細胞自体とそれ8人の隣人であるこの場合は3×3で) fun内の最近傍とその重みを表す行列であり、
library(raster) 

df <- matrix(1:10000, nrow = 100, ncol = 100, byrow = TRUE) 
dfR <- raster(df) 

dfSD <- as.matrix(focal(dfR, w = matrix(1,3,3), fun = sd)) 

。したがって、任意の近傍パターンは、それが行列で表すことができる限り、想像できる。

matrix(1,3,3) 
#  [,1] [,2] [,3] 
# [1,] 1 1 1 
# [2,] 1 1 1 
# [3,] 1 1 1 

(対角線とセル自体を除く)のみ4人の隣人と例:

matrix(c(0,1,0,1,0,1,0,1,0), 3, 3) 
#  [,1] [,2] [,3] 
# [1,] 0 1 0 
# [2,] 1 0 1 
# [3,] 0 1 0 
関連する問題