0

如果我有一个二维矩阵,并且我想在给定一些滤波器矩阵的情况下应用某种滤波器(例如扩张、侵蚀、索贝尔边缘检测):

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

将它应用于矩阵的最有效方法是什么。

For 循环遍历每个像素似乎效率太低:

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,但我想它只适用于一维信号。所以你有fft选择。在频域中进行操作并转换回时域。

在不知道预期输入/输出的情况下很难显示确切的步骤,但试试这个:

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