Рассчёт матрицы расстояний с помощью пользовательского расстояние Махаланобиса

Мне нужно рассчитать расстояние Махаланобиса по известной формуле: введите сюда описание изображения

Я проделал следущёе: у меня есть функция которая использует эту формулу:

overall_dist<-function(a, b, c, p, W){
  if(c=="Mahalanobis dist"){
    dist <- t(a-b)
    print(dist)
    dist <- dist%*%W
    print(dist)
    dist <- sqrt(dist%*%(a-b))
    print(dist)
    #dist <- dist * (a-b)
    #dist
    #dist <- sqrt(dist*(a-b))
  }
  return(dist)
}

Матрица коэфициентов выглядит следующим образом:

w1<-c(1,0)
w2<-c(0,1)
W<-rbind(w1,w2,w3)

Дальше есть другая функция, которая ведет рассчёт матрицы расстояний:

X<-matrix(c(-1,1,2,-1,2,3,1,2,3,0), nrow=5, ncol=2, byrow = TRUE)
X

make_dm<-function(mat){
matrix_dist<-matrix(0, nrow = nrow(mat), ncol = nrow(mat))
  for (i in 1:nrow(mat)) {
    for (j in 1:(i-1)){
      matrix_dist[i,j] <- overall_dist(mat[i,], mat[j,], c="Mahalanobis dist", p, W)
      matrix_dist[j,i] <- matrix_dist[i,j]
    }
  }
return(matrix_dist)
}
make_dm(X)

Если, например, у меня есть 2 вектора:

a<-c(1,2,3)
b<-c(4,6,1)

, то расстояние считает правильно, а при использовании функции для рассчёта матрицы расстояний получается вот такая ошибка.

Подскажите, пожалуйста, почему я получаю нули, в чем может быть проблема с ошибкой и как это исправить?

введите сюда описание изображения


Ответы (1 шт):

Автор решения: black_paladin

Как и говорится в ошибке, матрицы разной размерности. Во вложенных циклах размерность постоянно меняется. Нужно приводить к одной. https://fooobar.com/questions/1234120/error-in-r-nonconformable-arguments-not-true 2 вектора были одной длины, поэтому ошибки не выдает.

→ Ссылка