You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言的apply()调用的函数中传入矩阵与单元格坐标?

解决R语言邻域平均滤波中apply无法获取坐标的问题

你遇到的核心问题是:apply(matrix, 1:2, fun) 只会将当前元素的值传递给函数fun,不会自动传入该元素对应的行号i和列号j,所以直接在函数里使用i、j会因变量未定义报错。

下面提供两种可行的解决方案:

方法一:用outer生成坐标对并计算

通过outer生成所有行号和列号的组合,配合向量化包装的邻域平均函数实现:

# 定义邻域平均函数,参数为行号i、列号j和目标矩阵
neighbor_avg <- function(i, j, mat) {
  # 边界处理:避免越界,不存在的邻域用当前像素值替代(可根据需求修改)
  up <- if (j < ncol(mat)) mat[i, j+1] else mat[i, j]
  down <- if (j > 1) mat[i, j-1] else mat[i, j]
  left <- if (i > 1) mat[i-1, j] else mat[i, j]
  right <- if (i < nrow(mat)) mat[i+1, j] else mat[i, j]
  
  (up + down + left + right) / 4
}

# 示例:初始化矩阵并填充数据(替换成你的实际矩阵)
px <- 5
picture <- matrix(data = 0, nrow = px, ncol = px)
# 绘制方块+添加噪声(示例代码)
picture[2:4, 2:4] <- 1
picture <- picture + rnorm(px*px, 0, 0.1)

# 用outer生成结果矩阵,Vectorize让函数支持向量输入
picture_2 <- outer(1:nrow(picture), 1:ncol(picture), Vectorize(neighbor_avg), mat = picture)

方法二:使用专门的图像处理包(可选)

如果不需要手动实现,可直接用EBImage包的滤波函数快速完成邻域平均:

library(EBImage)

# 将矩阵转为图像对象
img <- Image(picture, dim = c(px, px))
# 创建上下左右四方向的平均滤波核
kernel <- matrix(c(0,1,0,1,0,1,0,1,0), nrow=3) /4
# 应用滤波
img_filtered <- filter2(img, kernel)
# 转回矩阵
picture_2 <- as.matrix(img_filtered)

关键说明

  • 边界处理必须重视:直接访问i-1、j+1会在矩阵边缘触发越界错误,示例中用当前像素值替代缺失的邻域,你也可以根据需求改为忽略缺失值、填充0或复制边界像素。
  • Vectorize的作用是让neighbor_avg能接收outer传入的行号/列号向量,避免显式循环。

内容的提问来源于stack exchange,提问作者HopelessUser69

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:42:40