Рассчитать евклидову матрицу расстояний в C - PullRequest
0 голосов
/ 03 марта 2020

Я хотел бы преобразовать этот код, который написан в MATLAB, в C:

matrix = [1 2 3; 4 5 6; 7 8 10]
dis=zeros(9);
for i=1:3
    for j=1:3
        dis(i,j)=sqrt(sum (abs((matrix(i,:)-matrix(j,:))))^2);
    end
end

Вывод выглядит следующим образом:

    0    9   19
    9    0   10
   19   10    0

Вот что я придумал с in C:

#include <stdio.h>
#include <math.h>

int main() {

  double distance[3][3] = {0};
  double myArray[3][3] = { {1, 2, 3}, {4 , 5, 6}, {7, 8, 9} };

  int i, j;
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {

      distance[i][j] = sqrt(pow(myArray[i] - myArray[j], 2));

    }
  }

  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {

      printf("%f ", distance[i][j]);
      if (j == 2) {
        printf("\n");
      }
    }
  }
  return 0;
}

но он отображает пустой массив:

0 0 0                                                     
0 0 0                                                                                       
0 0 0

Где моя ошибка?

1 Ответ

3 голосов
/ 03 марта 2020

Есть несколько проблем с вашим кодом.

  1. Я думаю, ваши входные данные для матрицы должны быть matrix = [1 2 3; 4 5 6; 7 8 10], однако входные данные в вашем коде разные (обратите внимание на последний элемент; 10 в назначении становится 9 в вашем коде).

  2. Эти точки, я думаю, являются пространственными (например, координаты x, y & z). Итак, вам нужен третий цикл; первый для точек во внешней l oop point_1 = { 1, 2, 3 }, ... et c, второй для точек во внутренней l oop ... point_2 = { 4, 5, 6 }... et c, и третий для трех координат x = 1, y = 2, z = 3.

  3. sqrt возвращает двойное число. Вам лучше привести возвращаемое значение к int, например, (int).

  4. Как указал @sahwahn; Вы вычисляете расстояние, но никогда не сохраняете значение.

Ваша вложенная структура l oop может выглядеть так:

for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
        int temp = 0;

        for (k = 0; k < 3; k++) {
            temp += (int)sqrt(pow(myArray[i][k] - myArray[j][k], 2));
        }

        distance[i][j] = temp;
    }
}

BTW; формула для вычисления истинного расстояния в пространственных координатах: square root of (the sum of the squares of (the coordinate difference)), а не the sum of (square root of (the squares of (the coordinate difference))).

Поскольку я не был уверен в назначении, я придерживаюсь информации, приведенной в вопросе. Логично, что для вычисления истинного расстояния ваш внутренний l oop должен быть;

double temp = 0.0f;

for (k = 0; k < 3; k++) {
    temp += pow(myArray[i][k] - myArray[j][k], 2);
}

distance[i][j] = (int)sqrt(temp);
...