【问题标题】:Calculate matrix rows with a vector using apply variation with multiple arguments使用具有多个参数的应用变体计算带有向量的矩阵行
【发布时间】:2012-11-23 11:22:42
【问题描述】:

我正在使用 R 语言从每个矩阵行值中找到 square of Euclidean distance 每行的指定向量,并且向量是用于比较两个点的点我创建了这个函数

euclDist <- function(p1, p2){
   sum((p1 - p2)^2)
}

现在我想创建一个函数,在矩阵中找到到指定点的欧几里得距离最小的行

  minDist<- function(points, p){
    dist = c()
    for(i in seq(1:length(points[,1])))
      dist[i] = euclDist2(points[i,], p)
    which.min(dist)
 }

例如

points = matrix(c(1:24), ncol=4)
p = c(1,2,1,2)
print(minDist(points, p))

结果是 1,因为第一行到点 p 的距离最小

这很好用,但我想通过使用 apply 变体之一来摆脱 for 循环,但我找不到一个可以逐行处理矩阵并支持多个参数的循环。

编辑:此问题已修改,因为第一个代码在括号和括号方面存在一些问题:-(

【问题讨论】:

  • 你的循环不起作用:length(points, 1)
  • 另外,你有变量 dist 和 dis
  • 并且for(i in... 中缺少关闭) 还请注意points 和p 具有不同的维度,points 每列有 6 个 obs,p 是一个向量只有 4 个元素。
  • 抱歉,我从更复杂的代码中提取了这段代码,然后即时更改它,现在我解决了所有问题并使其正常工作。

标签: r vector matrix apply


【解决方案1】:

应该是

minDist <- function(points, p) which.min(apply(points, 1, euclDist, p2 = p))

但总的来说,apply 并不比普通的 for 循环快很多。我可以看到两种编写更高效代码的方法:

第一个使用R向量化和循环:

minDist <- function(points, p) which.min(colSums((t(points) - p)^2))

第二个使用fields 包中的rdist 函数,它可以计算两组点之间的欧式距离:

minDist <- function(points, p) {
    require(fields)
    which.min(rdist(points, t(matrix(p))))
}

任何一种解决方案都应该比使用apply 快很多。

【讨论】:

  • 非常感谢第一个很棒,我拿下了
【解决方案2】:

由于问题是如何使用 apply 而不是你的 for 循环,以下将做到这一点。

要取回一个向量:

   dist <- sapply(points, euclDist, p)   # no need for the dist <- c()

要取回列表:

   dist <- lapply(points, euclDist, p)   # no need for the dist <- c()

但是,请注意您的代码还存在一些其他问题。最值得注意的是,我不确定您是否在计算欧几里得距离

【讨论】:

  • 感谢您的回复,很抱歉我的代码无法正常工作,但现在我已修复,请您按照修复的问题回复我,因为 sapply 没有给我我的期望
  • 如果您可以显示您期望的输出,并且您的 for 循环正在为您提供该输出,我很乐意在这里向您展示它与 lapply / sapply 实现的关系
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2018-12-23
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多