【问题标题】:R: pairwise Euclidean distance between columns of two matricesR:两个矩阵的列之间的成对欧几里得距离
【发布时间】:2011-09-05 14:44:12
【问题描述】:

以下循环运行时间过长(2 分钟/迭代) 肿瘤信号的大小为 950000x422 normal_signals 的大小为 950000x772 有关如何加快速度的任何想法?

for(i in 1:ncol(tumor_signals)){
x <- as.vector(tumor_signals[,i])
print("Assigned x")
y <- t((t(normal_signals) - x)^2)
print("assigned y")
y <- t(sqrt(colSums(y)))
print("done")
#all_distance <- cbind(all_distance,matrix(distance))
print(i)
}

【问题讨论】:

  • 您真的想从整个 normal_signals 矩阵中一次减去一列肿瘤信号吗?您真的想每次运行都将大型 normal_signals 矩阵转置 2 倍吗?如果有必要,您可以在开始之前执行一次。鉴于这两个数据集的列数或列数不同,那么欧几里得距离到底是多少?
  • @Jogn,同意,我对 OP 想要什么感到困惑。删除所有这些打印调用会大大加快速度。
  • 在如此庞大的数据结构中,t 无疑是瓶颈之一。
  • 好点。是的,t 是一个瓶颈,感谢大家帮助我解决这个问题。(我是一个新程序员,才几个月)。我安装了字段包。 rdist() 工作得更快。因此,处理所有内容大约需要 1.5 小时。要回答这个问题,输出必须是 ncol(normal_signals) x ncol(tumor_signals),每列 == 患者资料,因此我们需要计算每个患者到每个可用正常样本的距离。很抱歉有任何困惑,非常感谢您的帮助
  • 每个tumor_signal 列和每个normal_signal 列之间的距离。我不认为删除打印语句会加快这个过程。我插入了这些以查看哪个步骤最慢。还有其他检查方法吗?

标签: r performance matrix distance euclidean-distance


【解决方案1】:

您的代码中有一个错误——您不需要转置normal_signals。据我了解,对于所有i = 1,2,...422 和j=1,2,...,772,您正在尝试计算tumor_signals[,i] 和normal_signals[,j] 之间的欧几里得距离。您可能希望结果为 422 x 772 矩阵。包fields 中有一个函数rdist() 可以为您执行此操作:

require(fields)
result <- rdist(t(tumor_signals), t(normal_signals))

顺便说一句,谷歌搜索[R Euclidean distance] 很容易找到这个包。

【讨论】:

  • 我正在试用这个包:
  • 感谢 Prasad,帮了大忙。分解 dist 函数并删除 t 以几乎相同的速度得到相同的结果。
  • 现在。这样的搜索找到了这个问题。
猜你喜欢
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多