【问题标题】:apply function to every combination of rows R将函数应用于行 R 的每个组合
【发布时间】:2016-03-22 15:07:06
【问题描述】:

假设我有一个 1802 x 2 坐标矩阵(经度/纬度)coord 每行因此代表空间中的一个点。

   [,1]     [,2]
[1,] -90.0   -5
[2,] -87.5   -5
[3,] -85.0   -5
[4,] -82.5   -5
[5,] -80.0   -5
[6,] -77.5   -5

我使用 geosphere 包 distGeo 函数计算两点 p1 和 p2 之间的测地距离,即

distGeo(coord[1,],coord[2,])

我想为coord 中每个点之间的距离构建一个对称度量矩阵(因此为 1802*2,1802*2)

尝试循环为

for (i in 1:nrow(coord)){ 
 for (j in 1:nrow(coord)){
  distGeo(coord[i,],coord[j,])
 }
 }

需要永远(即使使用 doMPI 和分块),据我所知 outer 只能使用长度为 1 的参数。

有什么想法吗?

【问题讨论】:

  • 您可能需要?combn,即combn(seq_len(nrow(coord)), 2, FUN= function(x) distGeo(coord[x[1],], coord[x[2],]))
  • 谢谢。但它不会将一个元素与其自身进行比较(即距离为零,矩阵的对角线),并且它似乎没有以两种方式使用组合(即 1-2 和 2-1)。有办法处理吗?
  • 在这种情况下使用expand.grid 或outer
  • 正如我所说,外部似乎不接受长度 2(经度和纬度)作为参数。
  • 我猜你可以在list中使用它,(未测试)

标签: r matrix combinations


【解决方案1】:

我没有在 R 中找到解决方案,而是通过 Rcpp 求助于 C++ 循环解决方案,运行时间仅为 0.3 秒。

基本步骤:

1/ 将纬度/经度坐标转换成n个向量(每个点都是一个3d向量)

2/ 创建一个函数来计算 C++ 中两者的叉积、点积和 atan2(按照here 描述的算法)为每个 point_i,j。输入是带有每个点 n 向量的 NumericMatrix。结果是一个 NumericMatrix,其中包含每个点之间的角度(以弧度为单位)。

3/使用 Rcpp,您只需从 R 中调用函数,瞧!

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多