在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
相关产品推荐
相关产品推荐

