首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算两个不等维矩阵R中的欧氏距离

如何计算两个不等维矩阵R中的欧氏距离
EN

Stack Overflow用户
提问于 2018-01-05 07:25:23
回答 1查看 1.2K关注 0票数 2

如何计算矩阵A和矩阵B之间R中的欧几里德距离,如下所示:

我有两个矩阵,即矩阵A和矩阵B

矩阵A:

代码语言:javascript
复制
     [,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:

代码语言:javascript
复制
     [,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中每一列的欧氏距离。

例如,要在结果矩阵中获得以下结果的答案:

代码语言:javascript
复制
        [,1]
    [1,] 

计算结果如下:

代码语言:javascript
复制
    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

若要在结果矩阵中获得下列答案,请执行以下操作:

代码语言:javascript
复制
        [,2]
    [1,] 5.66

计算结果如下:

代码语言:javascript
复制
    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

若要在结果矩阵中获得下列答案,请执行以下操作:

代码语言:javascript
复制
        [,3]
    [1,] 9.00

计算结果如下:

代码语言:javascript
复制
    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是相同尺寸的情况下才能工作:

代码语言:javascript
复制
    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
      }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-05 08:49:17

只需更改for循环,就可以计算结果矩阵的每一行的所有三列:

代码语言:javascript
复制
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))

}

对任意数量的列广义的:

代码语言:javascript
复制
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))
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48109002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档