2017-03-21 29 views
0

所以我有一个数组[n m],我需要在C++中编码每行和数组中其他行之间的欧几里得距离,并将其存储在一个新的distance-array [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

我建议创建一个保存每个点/矢量坐标的'Point'或'Vector3D'类。 –

+0

p.s.你的代码不正确。您正在计算平方根的总和,而不是总和的平方根。 –

+0

另外,'^'不会做你认为它做的事。 –

回答

0

您的代码有几个问题。现在,让我们忽略for循环。我们将在稍后讨论。

首先,^是按位异或运算符(XOR)。它不像其他一些语言那样求幂。相反,您需要使用std::pow()

其次,你是求平方根,这不是计算欧几里德距离的正确方法。相反,你需要计算一个总和,然后取平方根。

现在我们来考虑for循环。假设你已经知道你想要计算两行之间的距离。致电r1r2。现在,您只需要将来自r1的一个坐标与来自r2的一个坐标配对。请注意,这些坐标将始终位于同一列中。这意味着您只需要一个循环来计算每对坐标差异的平方。然后你总结这些正方形。最后这个单循环之后你取平方根。

因为这样,我们需要遍历行来选择每个r1r2。好的,这将需要两个循环,因为我们希望每个循环都取每行的值。

总的来说,我们需要三个for循环。你可以通过很好地设计你的代码来使它更容易理解。例如,您可以创建一个保存每行的类或结构。如果您知道每行只有三个维度,则创建一个pointvector3类。现在你可以编写一个函数来计算两点之间的距离。最后,将点列表存储为一维数组。事实上,以这种方式分解数据和计算使得前面关于计算距离的讨论更容易理解。

+0

而不是'pow',我会使用'inline int sq(int v){return v * v; }' –

+0

@KhouriGiordano好的建议。对于这种情况,这肯定会更有效率。 –

+0

thanx为你的答案,是的,我注意到自从我很久以前停止编程以来,我有很多错误。 我会尝试你的建议 –

相关问题