我想计算R中的距离矩阵(使用欧几里得距离)
我知道如何在for循环中执行此操作
但是我该如何使用家庭功能?
require(magrittr)
data(iris)
set.seed(1)
data <- iris[sample(nrow(iris)) ,] # 打散資料
Xtrain <- data[1:100,1:4]
Xtest <- data[101:150,1:4]
M <- nrow(Xtrain)
N <- nrow(Xtest)
distmatrix <- matrix(0,nrow = M,ncol = N)
for(i in 1:M){
for(j in 1:N){
distmatrix[i,j]<- sum((Xtrain[i,]-Xtest[j,])^2) %>% sqrt()
}
}
对于mapply
和expand.grid
的所有组合考虑M
和N
:
params <- expand.grid(M=seq(M), N=seq(N))
distmatrix2 <- matrix(mapply(function(i,j) sqrt(sum((Xtrain[i,]-Xtest[j,])^2)),
params$M, params$N),
nrow = M, ncol = N)
# EQUIVALENT TO OP's distance
identical(distmatrix, distmatrix2)
# TRUE
对于mapply
和expand.grid
的所有组合考虑M
和N
:
params <- expand.grid(M=seq(M), N=seq(N))
distmatrix2 <- matrix(mapply(function(i,j) sqrt(sum((Xtrain[i,]-Xtest[j,])^2)),
params$M, params$N),
nrow = M, ncol = N)
# EQUIVALENT TO OP's distance
identical(distmatrix, distmatrix2)
# TRUE