在R语言中计算数组指定行对应坐标点间的距离
问题
我需要在R语言中计算3维数组curve_array内指定点的距离。该数组的每个切片(如Frame001.txt)包含11行2列的坐标数据,目标是计算每个切片中第1行与第11行对应点的距离。
尝试过的方法及遇到的问题:
- 用过
dist函数、geomorph::interlmkdist函数,未达到预期效果 - 使用
usedist::dist_subset时报错:Error in as.matrix(d)[idx, idx] : no 'dimnames' attribute for array - 手动调用
distancePointToPoint能得到结果,但需手动输入坐标,处理大规模数组效率极低
期望输出格式:
,, Frame001.txt [1] 2.781459 ,, Frame002.txt [1] 2.781459 ,, Frame003.txt [1] 2.781459 etc.
附curve_array的dput数据:
dput(curve_array) structure(c(30.1394716184822, 30.3407126170086, 30.5325951613319, 30.7234753517486, 30.9257187041817, 31.1335771291367, 31.3414355540918, 31.5239596442118, 31.7318180691669, 31.9556523747537, 32.172869253912, -16.9223869881883, -16.7211459896618, ...), dim = c(11L, 2L, 47L), dimnames = list(NULL, NULL, c("Frame001.txt", "Frame002.txt", "Frame003.txt", "Frame004.txt", "Frame005.txt", "Frame006.txt", "Frame007.txt", "Frame008.txt", "Frame009.txt", "Frame010.txt", "Frame011.txt", "Frame012.txt", "Frame013.txt", "Frame014.txt", "Frame015.txt", "Frame016.txt", "Frame017.txt", "Frame018.txt", "Frame019.txt", "Frame020.txt", "Frame021.txt", "Frame022.txt", "Frame023.txt", "Frame024.txt", "Frame025.txt", "Frame026.txt", "Frame027.txt", "Frame028.txt", "Frame029.txt", "Frame030.txt", "Frame031.txt", "Frame032.txt", "Frame033.txt", "Frame034.txt", "Frame035.txt", "Frame036.txt", "Frame037.txt", "Frame038.txt", "Frame039.txt", "Frame040.txt", "Frame041.txt", "Frame042.txt", "Frame043.txt", "Frame044.txt", "Frame045.txt", "Frame046.txt", "Frame047.txt")))
解决方案
方法1:用apply遍历切片(直观易读)
直接对数组的第3维度(切片)循环,提取每个切片的目标点坐标并计算欧氏距离:
# 计算每个切片第1行与第11行的欧氏距离 distances <- apply(curve_array, 3, function(slice) { point1 <- slice[1, ] point2 <- slice[11, ] sqrt(sum((point1 - point2)^2)) }) # 转换为与原数组切片对应格式的3维数组 result_array <- array( distances, dim = c(1, 1, length(distances)), dimnames = list(NULL, NULL, dimnames(curve_array)[[3]]) ) # 查看结果 print(result_array)
方法2:向量化运算(高效处理大规模数据)
利用数组维度特性批量提取坐标,通过向量化计算提升效率:
# 提取所有切片的第1行、第11行坐标 point1_all <- curve_array[1, , ] point2_all <- curve_array[11, , ] # 批量计算欧氏距离 distances <- sqrt(rowSums((t(point1_all) - t(point2_all))^2)) # 转换为目标格式的3维数组 result_array <- array( distances, dim = c(1, 1, length(distances)), dimnames = list(NULL, NULL, dimnames(curve_array)[[3]]) ) print(result_array)
说明
- 两种方法都能输出你需要的格式结果,向量化运算在处理超大规模数组时速度优势更明显
- 仅依赖基础R函数,避免了第三方包因维度名缺失导致的报错问题
内容的提问来源于stack exchange,提问作者cookies5098
相关产品推荐
相关产品推荐

