如何计算R中两个维度不等的矩阵之间的欧氏距离
How to calculate the euclidean distance in R between two matrices each with unequal dimensions
如何在 R 中计算矩阵 A 和矩阵 B 之间的欧氏距离,如下所示:
我有两个矩阵,矩阵 A 和矩阵 B
矩阵A:
[,1][,2]
[1,] 1 1
[2,] 1 2
[3,] 2 1
[4,] 2 2
[5,] 10 1
[6,] 10 2
[7,] 11 1
[8,] 11 2
[9,] 5 5
[10,] 5 6
矩阵 B:
[,1][,2][,3][,4][,5][,6]
[1,] 2 1 5 5 10 1
[2,] 1 1 2 1 10 1
[3,] 5 5 5 6 11 2
[4,] 2 2 5 5 10 1
[5,] 2 1 5 6 5 5
[6,] 2 2 5 5 11 1
[7,] 2 1 5 5 10 1
[8,] 1 1 5 6 11 1
[9,] 2 1 5 5 10 1
[10,] 5 6 11 1 10 2
I want the Result matrix (euclidean distance) to be as per below:
[1,] [,2] [,3]
[1,] 1.00 5.66 9.00
[2,] 1.00 1.41
[3,]
[4,]
[5,]
[7,]
[8,]
[9,]
[10]
对于矩阵 A 中的每一行,计算矩阵 B 中每一行中每两列的欧式距离。
例如,要在结果矩阵中获取以下内容的答案:
[,1]
[1,]
计算是:
A(1,1) - From Matrix A
B(2,1) - From Matrix B
= sqrt((xA -xB)^2 + (yA -yB)^2)
= sqrt((1-2)^2 + (1-1)^2)
= 1.00
xA and yA from Matrix A
xB and yB from Matrix B
要在结果矩阵中得到以下答案:
[,2]
[1,] 5.66
计算是:
A(1,1) - From Matrix A
B(5,5) - From Matrix B
= sqrt((xA -xB)^2 + (yA -yB)^2)
= sqrt((1-5)^2 + (1-5)^2)
= 5.66
要在结果矩阵中得到以下答案:
[,3]
[1,] 9.00
计算是:
A(1,1) - From Matrix A
B(10,1) - From Matrix B
= sqrt((xA -xB)^2 + (yA -yB)^2)
= sqrt((1-10)^2 + (1-1)^2)
= 9.00
目前,我的以下代码仅在矩阵 A 和 B 的维数相等时才有效:
distance <- function(MatrixA, MatrixB) {
resultMatrix <- matrix(NA, nrow=dim(MatrixA)[1], ncol=dim(MatrixB)[1])
for(i in 1:nrow(MatrixB)) {
resultMatrix[,i] <- sqrt(rowSums(t(t(MatrixA)-MatrixB[i,])^2))
}
resultMatrix
}
您只需要更改您的 for 循环,它会为每一行计算结果矩阵的所有三列:
for(i in 1:nrow(matA))
{
resultMatrix[i,1] <- sqrt(rowSums((t(MatrixA[i,])-MatrixB[i,1:2])^2))
resultMatrix[i,2] <- sqrt(rowSums((t(MatrixA[i,])-MatrixB[i,3:4])^2))
resultMatrix[i,3] <- sqrt(rowSums((t(MatrixA[i,])-MatrixB[i,5:6])^2))
}
泛化为任意数量的列:
for(i in 1:nrow(MatrixA))
{
for(j in 1:((dim(MatrixB)[2])/2))
{
k = (j * 2) - 1
resultMatrix[i,j] <- sqrt(rowSums((t(MatrixA[i,])-MatrixB[i,k:(k+1)])^2))
}
}
如何在 R 中计算矩阵 A 和矩阵 B 之间的欧氏距离,如下所示:
我有两个矩阵,矩阵 A 和矩阵 B
矩阵A:
[,1][,2]
[1,] 1 1
[2,] 1 2
[3,] 2 1
[4,] 2 2
[5,] 10 1
[6,] 10 2
[7,] 11 1
[8,] 11 2
[9,] 5 5
[10,] 5 6
矩阵 B:
[,1][,2][,3][,4][,5][,6]
[1,] 2 1 5 5 10 1
[2,] 1 1 2 1 10 1
[3,] 5 5 5 6 11 2
[4,] 2 2 5 5 10 1
[5,] 2 1 5 6 5 5
[6,] 2 2 5 5 11 1
[7,] 2 1 5 5 10 1
[8,] 1 1 5 6 11 1
[9,] 2 1 5 5 10 1
[10,] 5 6 11 1 10 2
I want the Result matrix (euclidean distance) to be as per below:
[1,] [,2] [,3]
[1,] 1.00 5.66 9.00
[2,] 1.00 1.41
[3,]
[4,]
[5,]
[7,]
[8,]
[9,]
[10]
对于矩阵 A 中的每一行,计算矩阵 B 中每一行中每两列的欧式距离。
例如,要在结果矩阵中获取以下内容的答案:
[,1]
[1,]
计算是:
A(1,1) - From Matrix A
B(2,1) - From Matrix B
= sqrt((xA -xB)^2 + (yA -yB)^2)
= sqrt((1-2)^2 + (1-1)^2)
= 1.00
xA and yA from Matrix A
xB and yB from Matrix B
要在结果矩阵中得到以下答案:
[,2]
[1,] 5.66
计算是:
A(1,1) - From Matrix A
B(5,5) - From Matrix B
= sqrt((xA -xB)^2 + (yA -yB)^2)
= sqrt((1-5)^2 + (1-5)^2)
= 5.66
要在结果矩阵中得到以下答案:
[,3]
[1,] 9.00
计算是:
A(1,1) - From Matrix A
B(10,1) - From Matrix B
= sqrt((xA -xB)^2 + (yA -yB)^2)
= sqrt((1-10)^2 + (1-1)^2)
= 9.00
目前,我的以下代码仅在矩阵 A 和 B 的维数相等时才有效:
distance <- function(MatrixA, MatrixB) {
resultMatrix <- matrix(NA, nrow=dim(MatrixA)[1], ncol=dim(MatrixB)[1])
for(i in 1:nrow(MatrixB)) {
resultMatrix[,i] <- sqrt(rowSums(t(t(MatrixA)-MatrixB[i,])^2))
}
resultMatrix
}
您只需要更改您的 for 循环,它会为每一行计算结果矩阵的所有三列:
for(i in 1:nrow(matA))
{
resultMatrix[i,1] <- sqrt(rowSums((t(MatrixA[i,])-MatrixB[i,1:2])^2))
resultMatrix[i,2] <- sqrt(rowSums((t(MatrixA[i,])-MatrixB[i,3:4])^2))
resultMatrix[i,3] <- sqrt(rowSums((t(MatrixA[i,])-MatrixB[i,5:6])^2))
}
泛化为任意数量的列:
for(i in 1:nrow(MatrixA))
{
for(j in 1:((dim(MatrixB)[2])/2))
{
k = (j * 2) - 1
resultMatrix[i,j] <- sqrt(rowSums((t(MatrixA[i,])-MatrixB[i,k:(k+1)])^2))
}
}