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



我想把这段用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() {
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. 我认为,矩阵的输入数据应该是matrix = [1 2 3; 4 5 6; 7 8 10],但代码中的输入数据不同(观察最后一个元素;赋值中的10变成代码中的9(。

  2. 我认为这些点是空间的(比如x,y和z坐标(。所以,你需要第三个循环;第一个用于外循环point_1 = { 1, 2, 3 }, ...等中的点,第二个用于内循环... point_2 = { 4, 5, 6 }...等中的点将,第三个用于三个坐标x = 1, y = 2, z = 3

  3. sqrt返回一个双精度。您最好像(int)一样将返回值强制转换为int。

  4. 正如@sahwahn所指出的;计算距离,但从不保存值。

您的嵌套循环结构可能看起来像;

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)))

因为我对任务不确定,所以我坚持问题中给出的信息。从逻辑上讲,对于真正的距离计算,你的内环需要是;

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);

相关内容

  • 没有找到相关文章

最新更新