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

在R中计算不等维度矩阵间的成对Euclidean距离

解决R中维度不等矩阵的分组欧氏距离计算问题

我明白你的需求:需要生成一个包含10个矩阵的列表,每个矩阵对应Matrix B的一行,存储Matrix A所有行与该行拆分出的3个二维向量的欧氏距离。下面我会提供两种解决方案,先修正基础R的循环逻辑,再展示如何用pdist函数更高效地实现。

1. 基础R循环实现(修正你的现有代码)

你的现有代码存在语法和逻辑两层问题:语法上有括号位置错误、运算符缺失;逻辑上只计算了A和B对应行的距离,没有覆盖A所有行与B每一行分组向量的计算。下面是修正后的完整代码:

# 定义计算函数
ObjCentDist <- function(matrixA, matrixB) {
  # 确定B的每一行可拆分的二维向量组数
  num_groups <- ncol(matrixB) / 2
  # 创建空列表存储最终结果(长度等于B的行数)
  result_list <- vector("list", nrow(matrixB))
  
  # 遍历Matrix B的每一行
  for (m in 1:nrow(matrixB)) {
    # 初始化当前行对应的结果矩阵(10行3列)
    current_matrix <- matrix(NA, nrow = nrow(matrixA), ncol = num_groups)
    
    # 遍历B当前行的每个二维向量分组
    for (j in 1:num_groups) {
      # 计算当前分组的列索引范围
      start_col <- (j - 1) * 2 + 1
      end_col <- start_col + 1
      # 提取B当前行的目标二维向量
      b_vector <- matrixB[m, start_col:end_col]
      
      # 遍历Matrix A的每一行,计算欧氏距离
      for (i in 1:nrow(matrixA)) {
        a_vector <- matrixA[i, ]
        # 欧氏距离公式:sqrt((x1-x2)² + (y1-y2)²)
        current_matrix[i, j] <- sqrt(sum((a_vector - b_vector)^2))
      }
    }
    # 将当前矩阵存入结果列表
    result_list[[m]] <- current_matrix
  }
  
  return(result_list)
}

# 定义矩阵A和B
matrixA <- matrix(c(1,1,1,2,2,1,2,2,10,1,10,2,11,1,11,2,5,5,5,6), ncol = 2, byrow = TRUE)
matrixB <- matrix(c(2,1,5,5,10,1,
                    1,1,2,1,10,1,
                    5,5,5,6,11,2,
                    2,2,5,5,10,1,
                    2,1,5,6,5,5,
                    2,2,5,5,11,1,
                    2,1,5,5,10,1,
                    1,1,5,6,11,1,
                    2,1,5,5,10,1,
                    5,6,11,1,10,2), nrow=10, ncol=6, byrow=TRUE)

# 调用函数得到结果
distance_list <- ObjCentDist(matrixA, matrixB)

# 验证示例结果:查看List[[1]]的第一行
distance_list[[1]][1, ]
# 输出:1.000000 5.656854 9.000000,与你的示例完全匹配

2. 使用pdist函数高效实现

如果你想用更简洁高效的方式实现(避免多层循环),可以利用pdist包的向量化计算能力,它底层做了优化,大矩阵场景下速度更快。

首先安装并加载包:

install.packages("pdist")
library(pdist)

然后实现函数:

ObjCentDist_pdist <- function(matrixA, matrixB) {
  num_groups <- ncol(matrixB) / 2
  result_list <- vector("list", nrow(matrixB))
  
  for (m in 1:nrow(matrixB)) {
    # 将B的当前行拆分成3个二维向量,组成3行2列的临时矩阵
    b_groups <- matrix(matrixB[m, ], ncol = 2, byrow = TRUE)
    # 用pdist计算A所有行与b_groups所有行的欧氏距离,直接得到10行3列的矩阵
    distance_matrix <- as.matrix(pdist(matrixA, b_groups))
    result_list[[m]] <- distance_matrix
  }
  
  return(result_list)
}

# 调用函数
distance_list_pdist <- ObjCentDist_pdist(matrixA, matrixB)

# 验证结果
distance_list_pdist[[1]][1, ]
# 同样得到正确的示例结果:1.000000 5.656854 9.000000

结果说明

运行任意一个函数后,你会得到符合要求的列表:

  • distance_list[[1]]:10行3列矩阵,存储Matrix A每一行与Matrix B第1行3个二维分组向量的欧氏距离
  • distance_list[[2]]:对应Matrix B第2行的计算结果,以此类推直到distance_list[[10]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:09:41