稀疏矩阵表示在 c 中表现得很奇怪

问题描述 投票:0回答:1

//稀疏矩阵

            #include <stdio.h>
            #include <stdlib.h>
            void display(int c, int sparse[][5])
            {
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < c; j++)
                    {
                        printf("%d ", sparse[i][j]);
                    }
                    printf("\n");
                }
            }
            int main()
            {
                int c = 0, array[5][5] =
                            {
                                {0, 0, 4, 0, 0},
                                {0, 7, 0, 0, 0},
                                {0, 0, 0, 9, 0},
                                {0, 6, 0, 3, 0},
                                {0, 0, 2, 0, 0}};

                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (array[i][j] != 0)
                        {
                            c++;
                        }
                    }
                }

                int k = 0, sparse[3][c];
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (array[i][j] != 0)
                        {
                            sparse[0][k] = i;
                            sparse[1][k] = j;
                            sparse[2][k] = array[i][j];
                            k++;
                        }
                    }
                }
                display(c, sparse);
                return 0;
            }

我尝试使用稀疏矩阵表示,它具有行、列、垂直非零元素的值,因此如果有 7 个非零元素,则将创建由行、列、等于三行的值和计数组成的新矩阵列数取决于非零的计数, 但它的行为很奇怪,首先我在声明一个新矩阵时注意到一个错误曲线,我必须在其中放置列大小(非零元素的计数),但我忽略了它,因为我想不出更好的方法, 它确实运行了,但答案很奇怪,虽然它确实是我想要的形式,但它是混合的,我的意思是,如果在找到非零元素时第一个元素是4,那么新矩阵第一列第三行应该包含4 ,但事实并非如此,而且一切都混淆了,

然后为了进行更改,我添加了另一个非零元素,它现在显示随机数,不知道如何,

c matrix sparse-matrix
1个回答
0
投票

这是一个正确获取数组索引的问题。修改的地方添加评论:

            #include <stdio.h>
            #include <stdlib.h>
            void display(int c, int sparse[][3])  // 5 -> 3
            {
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < c; j++)
                    {
                        printf("%d ", sparse[j][i]);
                    }
                    printf("\n");
                }
            }
            int main()
            {
                int c = 0, array[5][5] =
                            {
                                {0, 0, 4, 0, 0},
                                {0, 7, 11, 13, 0},
                                {0, 0, 0, 9, 0},
                                {0, 6, 0, 3, 0},
                                {0, 0, 2, 0, 0}};

                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (array[i][j] != 0)
                        {
                            c++;
                        }
                    }
                }

                int k = 0, sparse[c][3];  // Swap indexing to match expectation of display()
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (array[i][j] != 0)
                        {
                            sparse[k][0] = i;  // Indexing swapped
                            sparse[k][1] = j;
                            sparse[k][2] = array[i][j];
                            k++;
                        }
                    }
                }
                display(c, sparse);
                return 0;
            }
© www.soinside.com 2019 - 2024. All rights reserved.