所以我有一个数组n_m,我需要在c++中编码数组中每一行和其他行之间的欧几里德距离,并将其存储在一个新的距离数组n_n中,每个单元格的值都是相交行之间的距离。距离阵列:
r0 r1 .....rn
r0 0
r1 0
. 0
. 0
rn 0两行或两条记录之间的欧几里德距离是:假设我们有这两条记录:
r0: 1 8 7
r1: 2 5 3
r2
.
.
rnr0和r1之间的欧几里德距离= sqrt((1-2)^2+(8-5)^2+(7-3)^2) --我用了4个循环(我觉得太过了)--但是我做得不好,有人能帮我在不用3D数组的情况下对它进行编码吗?这是我的密码:
int norarr1[row][column] = { 1,1,1,2,2,2,3,3,3 };
int i = 0; int j = 0; int k = 0; int l = 0;
for (i = 0; i < column; i++){
for(j = 0; j < column; j++){
sumd = 0;
for (k = 0; k < row; k++) {
for (l = 0; l < row; l++) {
dist = sqrt((norarr1[i][k] - norarr1[j][l]) ^ 2);
sumd = sumd + dist;
cout << "sumd =" << sumd << " ";
}
cout << endl;
}
disarr[j][i] = sumd;
disarr[i][j] = sumd;
cout << disarr[i][j];
}
cout << endl;
}发布于 2017-03-21 18:51:40
您的代码有几个问题。现在,让我们忽略For循环。我们稍后再谈。
第一件事是^是位排他性或(XOR)运算符。它不像其他语言那样进行指数运算。相反,您需要使用std::pow()。
第二,你在求和平方根,这不是计算欧氏距离的正确方法。相反,您需要计算一个和,然后取平方根。
现在让我们考虑一下for循环。假设您已经知道要计算之间的距离的哪两行。把这些叫做r1和r2。现在您只需要将r1中的一个坐标与r2的一个坐标对起来。注意,这些坐标总是在同一列中。这意味着您只需要使用一个循环来计算每一对坐标差的平方。然后你把这些平方和起来。最后,在这个单循环之后,取平方根。
这样,我们就需要遍历行来选择每个r1和r2。好的,这需要两个循环,因为我们希望每个循环都能得到每一行的值。
总之,我们需要三个循环。通过很好地设计代码,您可以使这更容易理解。例如,您可以创建一个包含每一行的类或结构。如果您知道每一行都是三维的,那么就创建一个point或vector3类。现在你可以写一个函数来计算两点之间的距离。最后,将点列表存储为一维数组。事实上,用这种方式分解数据和计算,使得以前关于计算距离的讨论更容易理解。
https://stackoverflow.com/questions/42935448
复制相似问题