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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:41:46