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

在R语言中计算矩阵中同类单元格斑块的外围边数

计算矩阵斑块的外围边数

嘿,我来帮你搞定这个斑块外围边数的计算问题!其实核心逻辑非常直观,咱们拆解一下:

每个单元格本身有4条边,所以所有目标类别单元格的总边数是 4 * 斑块面积。但斑块内部的共享边会被重复计算(比如两个相邻的1单元格,它们之间的那条边会被两个单元格各算一次),所以需要把这些重复的部分减掉。每条内部共享边被计算了2次,因此外围边数 = 4斑块面积 - 2内部共享边数。

步骤1:计算斑块面积

这个很简单,直接统计目标类别(比如你的例子里的1)的单元格数量:

mat <- matrix(c(0,1,0, 1,1,1, 1,0,1), nrow = 3, ncol = 3, byrow = TRUE)
target_class <- 1
area <- sum(mat == target_class)
# 你的例子中area=6,和手动统计一致

步骤2:计算内部共享边数

内部共享边是指相邻(四邻域:上下左右)的同类单元格之间的边。我们可以通过移位矩阵的方式统计:

  • 把原矩阵向右平移一列,和原矩阵对比,统计对应位置都是目标类别的数量(这是左右相邻的共享边数)
  • 把原矩阵向下平移一行,和原矩阵对比,统计对应位置都是目标类别的数量(这是上下相邻的共享边数)
  • 两者相加就是总内部共享边数

代码实现:

# 统计左右相邻的共享边数
left_right_edges <- sum(mat[, -ncol(mat)] == target_class & mat[, -1] == target_class)
# 统计上下相邻的共享边数
top_bottom_edges <- sum(mat[-nrow(mat), ] == target_class & mat[-1, ] == target_class)
# 总内部共享边数
internal_edges <- left_right_edges + top_bottom_edges
# 你的例子中internal_edges=5,和你提到的一致

步骤3:计算外围边数

用咱们一开始的公式:

perimeter_edges <- 4 * area - 2 * internal_edges
# 你的例子中:4*6 - 2*5 = 24-10=14,和手动统计的结果完全匹配!

封装成函数(方便复用)

如果需要处理多个类别或者多个矩阵,可以把这些步骤封装成一个函数:

calculate_perimeter_edges <- function(mat, target_class) {
  area <- sum(mat == target_class)
  if (area == 0) return(0) # 处理没有目标类别的情况
  left_right <- sum(mat[, -ncol(mat)] == target_class & mat[, -1] == target_class)
  top_bottom <- sum(mat[-nrow(mat), ] == target_class & mat[-1, ] == target_class)
  internal <- left_right + top_bottom
  return(4 * area - 2 * internal)
}

# 测试你的例子
calculate_perimeter_edges(mat, 1) # 返回14,正确!
calculate_perimeter_edges(mat, 0) # 0类外围边数为12,符合手动统计结果

这个方法完全不需要依赖SDMTools包,直接用基础R就能实现,而且得到的是你需要的原始数值,方便后续计算聚集指数这类指标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:16:42