对R中的矩阵应用过滤器的最快方法
如果我有一个2d矩阵,并且我想在给定一些滤波器矩阵的情况下应用某种滤波器(例如,扩张、腐蚀、sobel边缘检测):对R中的矩阵应用过滤器的最快方法,r,image-processing,matrix,filter,filtering,R,Image Processing,Matrix,Filter,Filtering,如果我有一个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 } }
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
}
}
有一个函数叫做
卷积
,但我想它只适用于一维信号。因此,剩下的是fft
选项。在频域中进行操作,然后转换回时域
在不知道预期输入/输出的情况下,很难显示准确的步骤,但请尝试以下方法:
Re( fft( (1/dimension) * fft(signal) * fft(f), inverse=T))
我想这取决于你在做什么!!只需调用对矩阵进行操作的函数,即可将函数应用于矩阵的每个单元格。大概是这样的:
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
但正如@joran所说,这取决于你想做什么 如果没有一个特定的函数应用于每个像素,这是不可能回答的。也许你可以从
SpatialVx
package中的kernel2dsmooth
中得到启发…focal()
光栅包支持非常一般的操作,在这些操作中,你想要为每个单元计算其附近值的函数。还有,@JoshO'Brien在阅读第一个链接中的注释时,看起来焦点
已从光栅
移动,而且效率低下。也许我错过了什么。@agstudy--不,你误读了第一条评论。Re:效率,这总是相对的。这些2-D邻域操作通常比较慢(我认为每个单元的b/c必须访问几个不连续的内存块),并且无法从OP的问题判断它们需要多快。另外,你知道有更快的(R)吗?
apply( m , 1:2 , function(x){ x * 10 } )
# [,1] [,2] [,3]
#[1,] 240 160 20
#[2,] 110 100 50
#[3,] 230 190 80