所以我有一个数组[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
.
.
rn
r0和r1之间的欧几里德距离= sqrt((1-2)^ 2 +(8-5)^ 2 +(7-3)^ 2) 编码这个我使用了4个循环(我认为太多了)但是我做不到,有人可以帮助我编写这个而不使用3-D数组吗? 这是我的代码:
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;
}
答案 0 :(得分:0)
您的代码存在一些问题。现在,让我们忽略for循环。我们稍后会谈到的。
首先,^
是按位异或(XOR)运算符。它不像其他语言那样进行取幂。相反,您需要使用std::pow()
。
其次,你是平方根,这不是计算欧几里德距离的正确方法。相反,您需要计算总和,然后取平方根。
现在让我们考虑一下for循环。假设您已经知道要计算两行之间的距离。请致电这些r1
和r2
。现在,您只需将r1
中的一个坐标与r2
中的一个坐标配对即可。请注意,这些坐标始终位于同一列中。这意味着您只需要一个循环来计算每对坐标差异的平方。然后你总结这些方块。最后在这个单循环之后,你取平方根。
有了这个,我们需要迭代行来选择每个r1
和r2
。好的,这将需要两个循环,因为我们希望每个循环都具有每行的值。
总的来说,我们需要三个for循环。您可以通过很好地设计代码来使这更容易理解。例如,您可以创建一个包含每一行的类或结构。如果您知道每一行只有三个维度,那么请创建一个point
或vector3
类。现在你可以编写一个计算两点之间距离的函数。最后,将点列表存储为一维数组。事实上,以这种方式分解数据和计算使得之前关于计算距离的讨论更容易理解。