2013-04-19 5 views
0

에 행렬에 필터를 적용합니다 (예를 들어, 팽창 소벨 에지 검출, 침식) 주어진 몇 가지 필터 행렬 :가장 빠른 방법은 R

f = matrix(c(0,1,0, 
      1,1,1, 
      0,1,0), 3) 

행렬에 적용하는 가장 효율적인 방법은 무엇입니까? 각 픽셀 이상 반복에 대한

너무 비효율적 인 것 같다

for(i in 2:nrow(mat)){ 
    for(j in 2:ncol(mat)){ 
     //Apply filter to pixel i,j 
    } 
} 
+3

각 픽셀에 적용 할 _specific_ 함수가 없으면 대답 할 수 없습니다. – joran

+0

어쩌면 당신은'SpatialVx' 패키지의'kernel2dsmooth'에서 영감을받을 수 있습니다 ... – agstudy

+0

** 래스터 ** 패키지의'focal()'는 각 셀에 대해 다음과 같은 함수를 계산하려는 아주 일반적인 작업을 지원합니다 : 그 이웃에있는 값. [여기에 한 예가있다] (http://stackoverflow.com/questions/9931706/sliding-window-function-in-r/9933326#9933326) [여기에 또있다] (http://stackoverflow.com/questions/) 11059104/given-a-2d-numeric-height-map-matrix-in-r-how-can-i-find-all-local-maxima/11059479 # 11059479). –

답변

1

! 매트릭스에서 작동하는 함수를 호출하여 행렬의 모든 셀에 함수를 적용 할 수 있습니다. 이런 식으로 뭔가 : 같은

apply(m , 1:2 , function(x){ x * 10 }) 
# [,1] [,2] [,3] 
#[1,] 240 160 20 
#[2,] 110 100 50 
#[3,] 230 190 80 

그러나 :

f1 <- function(x){ x*2 } 

m <- matrix(sample(25,9),nrow=3) 
m 
# [,1] [,2] [,3] 
#[1,] 24 16 2 
#[2,] 11 10 5 
#[3,] 23 19 8 

## Operates on all cells as R treats the matrix like a vector 
f1(m) 
# [,1] [,2] [,3] 
#[1,] 48 32 4 
#[2,] 22 20 10 
#[3,] 46 38 16 

아니면 다음 행렬의/열의 각 행에 걸쳐 기능을 적용 할 apply을 사용할 수에 대한 구조의이 종류가 작동하지 않을 경우

@ 조란은 당신이하고 싶은 일에 달려 있다고 말했다.

0

convolve라는 기능이 있습니다,하지만 난 그게 1D 신호에만 작동합니다 같아요. 따라서 fft 옵션이 제공됩니다. 주파수 도메인에서 작업을 수행하고 시간 도메인으로 다시 변환하십시오. 예상 입력/출력을 모른 채 정확한 단계를 보여 주지만,이 시도

하드 : 그것은 당신이 내가 생각하고있는 것을 따라

Re(fft((1/dimension) * fft(signal) * fft(f), inverse=T))