对矩阵中的 select 个 window 单元格使用应用函数?
Using an apply function to select a window of cells from a matrix?
给定一个矩阵:
m <- matrix(rep(1:10,10),10,20)
是否可以使用 apply
函数在矩阵和 select 一个 window 单元格中移动(3 列和 3 行大 - 大小为 9 个单元格),每个单元格是 window 中 9 的焦点单元格?
因为我想要的 window 是 3x3 单元格,所以我可以在边缘用 1 行和 1 列 NA 填充矩阵,这样 window 将在包含一个的任何给定单元格上运行数量:
m <- cbind(matrix(,nrow(m),1),m,matrix(,nrow(m),1))
m <- rbind(matrix(,1,ncol(m)),m,matrix(,1,ncol(m)))
当这 9 个值是子集时,我希望每次单元格位于 9 个单元格的 window 中心时计算均值和 sd,并将这些单个值输出到新的相应矩阵(一个用于均值,一个用于 sd)。
我已经使用嵌套 for
循环手动完成此操作,但在大矩阵上,这是一个缓慢的过程。我还没有设法找到一个在行和列上创建 window 的函数,因此试图弄清楚这一点。
这是我的 for
循环示例:
m <- matrix(rep(1:10,10),10,20)
##The number of cells on each dimension of the window
window <- 3
pad <- (window-1)/2
##Row padding
m.pad <- rbind(matrix(,pad,ncol(m)),m,matrix(,pad,ncol(m)))
##Column padding
m.pad <- cbind(matrix(,nrow(m.pad),pad),m.pad,matrix(,nrow(m.pad),pad))
##Note real data dimensions in the padded matrix
maxrow <-nrow(m.pad)-pad
maxcol <- ncol(m.pad)-pad
##Create output matrices
mean_values <- matrix(,nrow(m),ncol(m))
sd_values <- matrix(,nrow(m),ncol(m))
##Moving window to create mean and sd
for (i in (pad+1):maxrow)
{
for (j in (pad+1):maxcol)
{
##Subset out the window into a vector,
##take mean and sd and put into new matrix
mean_values[(i-pad),(j-pad)] <- mean(as.vector(
m.pad[(i-pad):(i+pad),(j-pad):(j+pad)]),na.rm=TRUE)
sd_values[(i-pad),(j-pad)] <- sd(as.vector(
m.pad[(i-pad):(i+pad),(j-pad):(j+pad)]),na.rm=TRUE)
}
}
我想要的输出显示在 mean_values
和 sd_values
中。
非常感谢任何帮助。
这会起作用
subset_values <- do.call(rbind,lapply(1:nrow(m),function(i) t(sapply(1:ncol(m),function(j) m.pad[i:(i+2),j:(j+2)]))))
mean_values <- matrix(apply(subset_values,1,mean,na.rm=T),nrow = nrow(m),byrow = T)
sd_values <- matrix(apply(subset_values,1,sd,na.rm=T),nrow = nrow(m),byrow = T)
给定一个矩阵:
m <- matrix(rep(1:10,10),10,20)
是否可以使用 apply
函数在矩阵和 select 一个 window 单元格中移动(3 列和 3 行大 - 大小为 9 个单元格),每个单元格是 window 中 9 的焦点单元格?
因为我想要的 window 是 3x3 单元格,所以我可以在边缘用 1 行和 1 列 NA 填充矩阵,这样 window 将在包含一个的任何给定单元格上运行数量:
m <- cbind(matrix(,nrow(m),1),m,matrix(,nrow(m),1))
m <- rbind(matrix(,1,ncol(m)),m,matrix(,1,ncol(m)))
当这 9 个值是子集时,我希望每次单元格位于 9 个单元格的 window 中心时计算均值和 sd,并将这些单个值输出到新的相应矩阵(一个用于均值,一个用于 sd)。
我已经使用嵌套 for
循环手动完成此操作,但在大矩阵上,这是一个缓慢的过程。我还没有设法找到一个在行和列上创建 window 的函数,因此试图弄清楚这一点。
这是我的 for
循环示例:
m <- matrix(rep(1:10,10),10,20)
##The number of cells on each dimension of the window
window <- 3
pad <- (window-1)/2
##Row padding
m.pad <- rbind(matrix(,pad,ncol(m)),m,matrix(,pad,ncol(m)))
##Column padding
m.pad <- cbind(matrix(,nrow(m.pad),pad),m.pad,matrix(,nrow(m.pad),pad))
##Note real data dimensions in the padded matrix
maxrow <-nrow(m.pad)-pad
maxcol <- ncol(m.pad)-pad
##Create output matrices
mean_values <- matrix(,nrow(m),ncol(m))
sd_values <- matrix(,nrow(m),ncol(m))
##Moving window to create mean and sd
for (i in (pad+1):maxrow)
{
for (j in (pad+1):maxcol)
{
##Subset out the window into a vector,
##take mean and sd and put into new matrix
mean_values[(i-pad),(j-pad)] <- mean(as.vector(
m.pad[(i-pad):(i+pad),(j-pad):(j+pad)]),na.rm=TRUE)
sd_values[(i-pad),(j-pad)] <- sd(as.vector(
m.pad[(i-pad):(i+pad),(j-pad):(j+pad)]),na.rm=TRUE)
}
}
我想要的输出显示在 mean_values
和 sd_values
中。
非常感谢任何帮助。
这会起作用
subset_values <- do.call(rbind,lapply(1:nrow(m),function(i) t(sapply(1:ncol(m),function(j) m.pad[i:(i+2),j:(j+2)]))))
mean_values <- matrix(apply(subset_values,1,mean,na.rm=T),nrow = nrow(m),byrow = T)
sd_values <- matrix(apply(subset_values,1,sd,na.rm=T),nrow = nrow(m),byrow = T)