首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组中每个记录与其他记录之间的欧几里德距离

数组中每个记录与其他记录之间的欧几里德距离
EN

Stack Overflow用户
提问于 2017-03-21 18:30:47
回答 1查看 1.2K关注 0票数 0

所以我有一个数组n_m,我需要在c++中编码数组中每一行和其他行之间的欧几里德距离,并将其存储在一个新的距离数组n_n中,每个单元格的值都是相交行之间的距离。距离阵列:

代码语言:javascript
复制
   r0 r1 .....rn
   r0 0
   r1    0
   .       0
   .          0
  rn            0

两行或两条记录之间的欧几里德距离是:假设我们有这两条记录:

代码语言:javascript
复制
 r0: 1 8 7
 r1: 2 5 3
 r2
 .
 .
 rn

r0和r1之间的欧几里德距离= sqrt((1-2)^2+(8-5)^2+(7-3)^2) --我用了4个循环(我觉得太过了)--但是我做得不好,有人能帮我在不用3D数组的情况下对它进行编码吗?这是我的密码:

代码语言:javascript
复制
    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;
}
EN

回答 1

Stack Overflow用户

发布于 2017-03-21 18:51:40

您的代码有几个问题。现在,让我们忽略For循环。我们稍后再谈。

第一件事是^是位排他性或(XOR)运算符。它不像其他语言那样进行指数运算。相反,您需要使用std::pow()

第二,你在求和平方根,这不是计算欧氏距离的正确方法。相反,您需要计算一个和,然后取平方根。

现在让我们考虑一下for循环。假设您已经知道要计算之间的距离的哪两行。把这些叫做r1r2。现在您只需要将r1中的一个坐标与r2的一个坐标对起来。注意,这些坐标总是在同一列中。这意味着您只需要使用一个循环来计算每一对坐标差的平方。然后你把这些平方和起来。最后,在这个单循环之后,取平方根。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42935448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档