0

2D マトリックスがあり、特定のフィルター マトリックスに何らかのフィルター (膨張、浸食、ソーベル エッジ検出など) を適用したい場合:

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
    }
}
4

2 に答える 2

1

それはあなたが何をしているかによると思います!! マトリックスで動作する関数を呼び出すだけで、マトリックスのすべてのセルに関数を適用できます。このようなもの:

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は、行列の各行/列に関数を適用するために使用できます。

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

しかし、@joranが言ったように、それはあなたが何をしたいかによって異なります!

于 2013-04-19T16:34:02.397 に答える
0

という関数がありますがconvolve、1D信号に対してのみ機能すると思います。したがって、fftオプションが残っています。周波数ドメインで操作を行い、時間ドメインに変換します。

予想される入力/出力を知らずに正確な手順を示すのは難しいですが、これを試してください:

Re( fft( (1/dimension) * fft(signal) * fft(f), inverse=T))
于 2013-04-19T16:32:52.867 に答える