如果我有一个2d矩阵,并且我想应用某种滤波器矩阵来应用某种滤波器(例如扩张,侵蚀,sobel边缘检测):
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
}
}
答案 0 :(得分: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说的,这取决于你想做什么!
答案 1 :(得分:0)
有一个名为convolve
的函数,但我猜它只适用于1D信号。所以你留下了fft
选项。在频域中进行操作并转换回时域。
很难在不知道预期输入/输出的情况下显示确切的步骤,但请尝试以下方法:
Re( fft( (1/dimension) * fft(signal) * fft(f), inverse=T))