计算C中的欧几里得距离矩阵

问题描述 投票:0回答:1

我想将用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

这是我在C语言中想到的:

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

int main() {

  int distance[3][3] = {0};
  int 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++) {

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

    }
  }

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

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

但是它显示一个空数组:

0 0 0                                                     
0 0 0                                                                                       
0 0 0

我的错误在哪里?

c matlab code-translation
1个回答
0
投票

所以您正在做一些允许的事情,但会导致程序的功能失效,所以让我们看一下:

int distance[3][3] = {0};
int distance = sqrt(pow(myArray[i] - myArray[j], 2));

您两次启动相同的变量->这是for循环中的局部变量。因此,您正在计算并删除它。在C语言中,局部变量可以被覆盖。因此,此问题的解决方案是删除int以进行计算。一旦执行此操作,您将获得以下输出:

 0 3 6
 3 0 3
 6 3 0

为什么会这样。答案是因为您处理数组错误。像Matlab一样,C语言不支持矩阵格式。这意味着您计算的这一部分是错误的:

myArray[i] - myArray[j]

仅计算

myArray[i][0]-myArray[j][0]

即使您想使用myArray[i][0]-myArray[j][0]进行此计算,因为另一种方法也会导致混淆。

您需要在变量级别而不是向量或矩阵级别处理计算。例如……:(相同矩阵的2个向量的skalar)

int mymatrix [3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i,sum=0;

    for(i=0;i<3;i++)
    {
       sum=sum+mymatrix[0][i]*mymatrix[1][i]
    }

因此,基本上,您需要重做计算。

© www.soinside.com 2019 - 2024. All rights reserved.