1

我正在尝试计算两个矩阵之间的距离。例如。它是这样的。

矩阵-M1

1 2
3 4 
5 6 
7 8
9 0

矩阵-M2

1 1
2 2

距离矩阵(d1 是 M1 第 1 行和 M2 第 1 行之间的距离,d2 是 M1 第 1 行和 M2 第 2 行之间的距离。)

  d1 d2
  d3 d4 
  d5 d6 
  d7 d8 
  d9 d10

我尝试了下面的代码但不起作用。请帮助我。

    #include<stdio.h>
    #include<math.h>

    int calcdist(int ,int ,int ,int);

    int main()
    {
            int points[5][2];
            int centroid[2][2];
            int distance[5][2];
            int i,j,k;
            printf("Enter the points:\n");
            for(i=0;i<5;i++)
            for(j=0;j<2;j++)
            scanf("%d",&points[i][j]);

            printf("Displaying the points.\n");
            for(i=0;i<5;i++)
            {
                    for(j=0;j<2;j++)
                    printf("%d\t",points[i][j]);
                    printf("\n");
            }

            printf("Enter the centroids:\n");
            for(i=0;i<2;i++)
            for(j=0;j<2;j++)
            scanf("%d",&centroid[i][j]);

            printf("Displaying the centroids.\n");
            for(i=0;i<2;i++)
            {
                    for(j=0;j<2;j++)
                    printf("%d\t",centroid[i][j]);
                    printf("\n");
            }

            for(i=0;i<5;i++)
            {
                    k=0;
                    for(j=0;j<2;j++)
                    {
                            distance[i][j]=calcdist(points[i][j],points[i][j+1],centroid[k][j],centroid[k][j+1]);
 }
        }

        printf("The distance between the points and centroids are as below.\n");
        for(i=0;i<5;i++)
        {
                for(j=0;j<2;j++)
                {
                        printf("%d\t",distance[i][j]);
                }
                printf("\n");
        }

        return 0;
}

int calcdist(int a,int b,int c,int d)
{
        int dist;
        dist=sqrt(pow((c-a),2)+pow((d-b),2));
        return dist;
}
4

2 回答 2

2

计算时的迭代超出范围(等):

IE:

        fprintf(stderr,
            "dist[%d][%d] :: "
            "pt[%d][%d](%d), "
            "pt[%d][%d](%d), "
            "cn[%d][%d](%d), "
            "cn[%d][%d](%d) => "
            "%d\n"
            ,
            i, j,
            i, j, points[i][j],
            i, j + 1, points[i][j + 1],
            k, j, centroid[k][j],
            k, j + 1, centroid[k][j + 1],
            distance[i][j]
        );

你得到:

                      a            b            c            d    
dist[0][0] ::pt[0][0](1), pt[0][1](2), cn[0][0](1), cn[0][1](1) => 1
dist[0][1] ::pt[0][1](2), pt[0][2](3), cn[0][1](1), cn[0][2](2) => 1
dist[1][0] ::pt[1][0](3), pt[1][1](4), cn[0][0](1), cn[0][1](1) => 3
dist[1][1] ::pt[1][1](4), pt[1][2](5), cn[0][1](1), cn[0][2](2) => 4
dist[2][0] ::pt[2][0](5), pt[2][1](6), cn[0][0](1), cn[0][1](1) => 6
dist[2][1] ::pt[2][1](6), pt[2][2](7), cn[0][1](1), cn[0][2](2) => 7
dist[3][0] ::pt[3][0](7), pt[3][1](8), cn[0][0](1), cn[0][1](1) => 9
dist[3][1] ::pt[3][1](8), pt[3][2](9), cn[0][1](1), cn[0][2](2) => 9
dist[4][0] ::pt[4][0](9), pt[4][1](0), cn[0][0](1), cn[0][1](1) => 8
dist[4][1] ::pt[4][1](0), pt[4][2](1), cn[0][1](1), cn[0][2](2) => 1

centroid[0][2]超出 centroid 以及 ie 的范围point[1][2]

还; 该calcdist函数返回一个int,这意味着所有距离都向零舍入。sqrt(61) = 7.810 => 7

使长话短说; 尝试类似:

        distance[i][j] = calcdist(
                    points[i][0],
                    points[i][1],
                    centroid[j][0],
                    centroid[j][1]
                );

IE:

$ gcc -Wall -Wextra -pedantic -std=c89 -ggdb -DDEBUG -o dist dist.c -lm

代码:

#include <stdio.h>
#include <math.h>

int calcdist(int, int, int, int);

void prnt_2dmatrix(const char *title, int m[][2], int len)
{
    int i;

    fprintf(stdout, "%s {\n", title);
    for (i = 0; i < len; i++) {
        fprintf(stdout,
            "  %d    %d\n",
            m[i][0],
            m[i][1]
        );
    }
    fprintf(stdout, "}\n");
}

int main(int argc, char *argv[])
{
    int points[5][2] = {{1,2},{3,4},{5,6},{7,8},{9,0}};
    int centroid[2][2] = {{1,1},{2,2}};
    int distance[5][2] = {{0},{0}};
    int i, j;

    if (argc > 1 && argv[1][0] == 't') {
        printf("Using internal test vectors.\n");
    } else {
        printf("Enter the points:\n");
        for (i = 0; i < 5; i++)
            for (j = 0; j < 2; j++)
                scanf("%d", &points[i][j]);

        printf("Enter the centroids:\n");
        for (i = 0; i < 2; i++)
            for (j = 0; j < 2; j++)
                scanf("%d", &centroid[i][j]);
    }

    prnt_2dmatrix("Points", points, 5);
    prnt_2dmatrix("Centroids", centroid, 2);

    for (i = 0; i < 5; i++) {
        for (j = 0; j < 2; j++) {
            distance[i][j] = calcdist(
                        points[i][0],
                        points[i][1],
                        centroid[j][0],
                        centroid[j][1]
                    );
#ifdef DEBUG
            fprintf(stderr,
                "dist[%d][%d] = "
                "pt[%d][%d](%d), "
                "pt[%d][%d](%d), "
                "cn[%d][%d](%d), "
                "cn[%d][%d](%d) => "
                "%d\n"
                ,
                i, j,
                i, 0, points[i][0],
                i, 1, points[i][1],
                j, 0, centroid[j][0],
                j, 1, centroid[j][1],
                distance[i][j]
            );
        }
        printf("\n");
#else
        }
#endif
    }

    prnt_2dmatrix("Distance points <-> centroids", distance, 5);

    return 0;
}

int calcdist(int a, int b, int c, int d)
{
#ifdef DEBUG
    fprintf(stderr,
        " sqrt((%2d - %2d)^2 + (%2d - %2d)^2) =\n"
        " sqrt(       %2d^2 +        %2d^2) =\n"
        " sqrt(         %2.f +          %2.f) =\n"
        " sqrt(                       %2.f) = "
        " %.3f\n"
        ,
        c, a, d, b,
        c - a, d - b,
        pow(c - a, 2), pow(d - b, 2),
        pow(c - a, 2) + pow(d - b, 2),
        sqrt(pow((c - a), 2) + pow((d - b), 2))
    );
#endif
    return sqrt(pow((c - a), 2) + pow((d - b), 2));
}
于 2012-09-13T05:38:32.637 回答
0

据我所知,您正在计算所有点与“质心”数组第一行的距离。如果这是错误的,您可能需要在主 for 循环中迭代“k”。

于 2012-09-13T05:08:11.630 回答