【问题标题】:Distance matrix距离矩阵
【发布时间】:2016-12-06 14:57:49
【问题描述】:

我正在尝试确定一个数据集中的每个点与 R 中的另一个数据集之间的距离。每个数据集都有一个 X 和 Y 参数。我一直在将数据集转换为数据框并找到距离。但是,我当前的代码创建了一个大矩阵,因为此将数据集列为列和行。然后,我需要确定我关心的矩阵的特定部分以获得答案,有没有办法将 DSA 作为列,将 DSB 作为行。这会将矩阵削减 1/4,因为我的数据集包含数千个点,每个点都真正减少了算法运行的时间

这是我正在使用的代码

tumor<-data.frame(DSA[,c ("X_Parameter","Y_Parameter")])
cells<-data.frame(DSB[,c ("X_Parameter","Y_Parameter")])
distances<-as.matrix(dist(rbind(tumor,cells)))
row.start<-nrow(tumor)+1
row.end<-nrow(tumor)+nrow(cells)
col.start<-1
col.end<-nrow(tumor)
distances[row.start:row.end, col.start:col.end]
d<- distances[row.start:row.end, col.start:col.end]

【问题讨论】:

  • 请提供一个可重现的示例(模拟值很好),您尝试过的代码以及所需的结果应该是什么样子。

标签: r matrix distance


【解决方案1】:

这将只计算您需要的矩阵部分:

tumoridx <- rep(1:nrow(tumor), each=nrow(cells)
cellsidx <- rep(1:nrow(cells), nrow(tumor))
tcdist <- matrix(sqrt(rowSums((tumor[tumoridx, ] - cells[cellsidx, ])^2)),
     nrow(cells), nrow(tumor))

【讨论】:

    【解决方案2】:

    试试flexclust::dist2:

    n_tumor = 2000
    n_cells = 2000
    tumor = matrix(runif(n_tumor * 2), n_tumor, )
    cells = matrix(runif(n_cells * 2), n_cells, )
    
    t_dist = system.time({
      distances<-as.matrix(dist(rbind(tumor,cells)))
      row.start<-nrow(tumor)+1
      row.end<-nrow(tumor)+nrow(cells)
      col.start<-1
      col.end<-nrow(tumor)
      d <- distances[row.start:row.end, col.start:col.end]
    })[3]
    
    require(flexclust)
    t_dist2 = system.time({d2 = dist2(x = cells, y = tumor, method = "euclidean")})[3]
    
    t_dist # 1.477
    t_dist2 # 0.244
    identical(unname(d), d2) # TRUE
    

    编辑: 另一种选择是proxy::dist

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-08
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      相关资源
      最近更新 更多