更好的计算与R的欧氏距离的方法



我正在尝试计算Iris数据集的欧几里得距离。基本上我想计算每对物体之间的距离。我有一个代码工作如下:

for (i in 1:iris_column){
  for (j in 1:iris_row) {
    m[i,j] <- sqrt((iris[i,1]-iris[j,1])^2+
                   (iris[i,2]-iris[j,2])^2+
                   (iris[i,3]-iris[j,3])^2+
                   (iris[i,4]-iris[j,4])^2)
  }
}

虽然这可以工作,但我不认为这是编写r风格代码的好方法。我知道R有内置函数来计算欧几里得函数。不使用内置函数,我想知道更好的代码(更快,更少的行),可以做同样的我的代码。

循环内的部分可以写成

m[i, j] = sqrt(sum((iris[i, ] - iris[j, ]) ^ 2))

我会保留嵌套循环,这里没有问题

或者继续使用标准包stats:

m <- dist(iris[,1:4]))

这为您提供了一个dist类的对象,它紧凑地存储了下面的三角形(您所需要的全部)。你可以得到一个普通的全对称矩阵,例如,你想看一些元素:

> as.matrix(m)[1:5,1:5]
          1         2        3         4         5
1 0.0000000 0.5385165 0.509902 0.6480741 0.1414214
2 0.5385165 0.0000000 0.300000 0.3316625 0.6082763
3 0.5099020 0.3000000 0.000000 0.2449490 0.5099020
4 0.6480741 0.3316625 0.244949 0.0000000 0.6480741
5 0.1414214 0.6082763 0.509902 0.6480741 0.0000000

最新更新