-2

我正在使用 R 语言来查找从每个矩阵行值到每行的指定向量的欧几里得距离平方, 并且向量是用于比较两个点的点我创建了这个函数

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 的距离最小

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

编辑:这个问题被修改,因为第一个代码有括号和括号的问题:-(

4

2 回答 2

2

它应该是

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))

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

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

任何一种解决方案都应该比使用apply.

于 2012-12-06T00:56:13.983 回答
0

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

要取回向量:

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

要取回列表:

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

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

于 2012-12-05T19:04:58.833 回答