数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 540|回复: 1

[软件] C\C# 专家请进,二者结果为什么不同

[复制链接]
发表于 2024-12-15 19:07:20 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
本帖最后由 bh4qix 于 2024-12-15 21:50 编辑

从一个大程序里摘录出来的 C 代码,然后高度简化,再翻译成 C#
结果不同,请高手指点!多谢!


main()
{
        double **a, **a_inv;

        double big, pivot_inverse, temp, abs_element;
        int *pivot_flag, *swap_col, *swap_row;
        int i, j, n, row, col, swap, irow, icol;

        n = 3;

        a = (double **)calloc(n, 4);

        for (i = 0; i < n; i++)
        {
                a = (double *)calloc(n, sizeof(double));
        }

        a[0][0] = -1;    a[0][1] = 2;    a[0][2] = 1;
        a[1][0] = -2;    a[1][1] = 2;    a[1][2] = 1;
        a[2][0] = -1;    a[2][1] = 2;    a[2][2] = 3;

        printf("\nA matrix:");

        for (i = 0; i < n; i++)
        {
                printf("\nRow%3d:", i);

                for (j = 0; j < n; j++)
                {
                        printf("%14.5lg", a[j]);
                }
        }

        /*--------------*/

        a_inv = (double **)calloc(n, 4);

        for (i = 0; i < n; i++)
        {
                a_inv = (double *)calloc(n, sizeof(double));
        }

        for (i = 0; i < n; i++)
        {
                for (j = 0; j < n; j++)
                {
                        a_inv[j] = a[j];
                }
        }

        pivot_flag = (int *)calloc(n, sizeof(int));
        swap_row = (int *)calloc(n, sizeof(int));
        swap_col = (int *)calloc(n, sizeof(int));

        for (i = 0; i < n; i++)
        {
                big = 0.0;
                for (row = 0; row < n; row++) {
                        if (!pivot_flag[row])
                        {
                                for (col = 0; col < n; col++)
                                {
                                        if (!pivot_flag[col])
                                        {
                                                abs_element = fabs(a_inv[row][col]);
                                                if (abs_element >= big)
                                                {
                                                        big = abs_element;
                                                        irow = row;
                                                        icol = col;
                                                }
                                        }
                                }
                        }
                }
                pivot_flag[icol]++;

                if (irow != icol)
                {
                        for (col = 0; col < n; col++)
                        {
                                temp = a_inv[irow][col];
                                a_inv[irow][col] = a_inv[icol][col];
                                a_inv[icol][col] = temp;
                        }
                }

                swap_row = irow;
                swap_col = icol;

                pivot_inverse = 1.0 / a_inv[icol][icol];
                a_inv[icol][icol] = 1.0;
                for (col = 0; col < n; col++)
                        a_inv[icol][col] = a_inv[icol][col] * pivot_inverse;

                for (row = 0; row < n; row++)
                {
                        if (row != icol)
                        {
                                temp = a_inv[row][icol];
                                a_inv[row][icol] = 0.0;
                                for (col = 0; col < n; col++)
                                        a_inv[row][col] = a_inv[row][col] - a_inv[icol][col] * temp;
                        }
                }
        }

        for (swap = n - 1; swap >= 0; swap--)
        {
                if (swap_row[swap] != swap_col[swap])
                {
                        for (row = 0; row < n; row++)
                        {
                                temp = a_inv[row][swap_row[swap]];
                                a_inv[row][swap_row[swap]] = a_inv[row][swap_col[swap]];
                                a_inv[row][swap_col[swap]] = temp;
                        }
                }
        }

        free((char *)pivot_flag);
        free((char *)swap_row);
        free((char *)swap_col);


        /*-------------*/

        printf("\n\nA matrix inverse (Ai):");

        for (i = 0; i < n; i++)
        {
                printf("\nRow%3d:", i);

                for (j = 0; j < n; j++)
                {
                        printf("%14.5lg", a_inv[j]);
                }
        }

        printf("\n\n");
}

===========================================================================

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var sb = new StringBuilder();

            var n = 3;

            var a = new double[n, n];
            var a_inv = new double[n, n];

            double big, pivot_inverse, temp, abs_element;

            var pivot_flag = new int[n];
            var swap_col = new int[n];
            var swap_row = new int[n]; ;

            var irow = 0;
            var icol = 0;

            a[0, 0] = -1; a[0, 1] = 2; a[0, 2] = 1;
            a[1, 0] = -2; a[1, 1] = 2; a[1, 2] = 1;
            a[2, 0] = -1; a[2, 1] = 2; a[2, 2] = 3;

            sb.Append("\nA matrix:");

            for (int i = 0; i < n; i++)
            {
                sb.Append("\nRow ").Append(i.ToString()).Append("\t");

                for (int j = 0; j < n; j++)
                {
                    sb.Append(a[i, j].ToString()).Append("\t");
                }
            }

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    a_inv[i, j] = a[i, j];
                }
            }

            for (int i = 0; i < n; i++)
            {
                big = 0.0;
                for (int row = 0; row < n; row++)
                {
                    if (pivot_flag[row] != 0)
                    {
                        for (int col = 0; col < n; col++)
                        {
                            if (pivot_flag[col] != 0)
                            {
                                abs_element = Math.Abs(a_inv[row, col]);
                                if (abs_element >= big)
                                {
                                    big = abs_element;
                                    irow = row;
                                    icol = col;
                                }
                            }
                        }
                    }
                }
                pivot_flag[icol]++;

                if (irow != icol)
                {
                    for (int col = 0; col < n; col++)
                    {
                        temp = a_inv[irow, col];
                        a_inv[irow, col] = a_inv[icol, col];
                        a_inv[icol, col] = temp;
                    }
                }

                swap_row = irow;
                swap_col = icol;

                pivot_inverse = 1.0 / a_inv[icol, icol];
                a_inv[icol, icol] = 1.0;
                for (int col = 0; col < n; col++)
                    a_inv[icol, col] = a_inv[icol, col] * pivot_inverse;

                for (int row = 0; row < n; row++)
                {
                    if (row != icol)
                    {
                        temp = a_inv[row, icol];
                        a_inv[row, icol] = 0.0;
                        for (int col = 0; col < n; col++)
                            a_inv[row, col] = a_inv[row, col] - a_inv[icol, col] * temp;
                    }
                }
            }

            for (int swap = n - 1; swap >= 0; swap--)
            {
                if (swap_row[swap] != swap_col[swap])
                {
                    for (int row = 0; row < n; row++)
                    {
                        temp = a_inv[row, swap_row[swap]];
                        a_inv[row, swap_row[swap]] = a_inv[row, swap_col[swap]];
                        a_inv[row, swap_col[swap]] = temp;
                    }
                }
            }

            sb.Append("\n\nA matrix inverse (Ai):");

            for (int i = 0; i < n; i++)
            {
                sb.Append("\nRow:").Append(i.ToString()).Append("\t");

                for (int j = 0; j < n; j++)
                {
                    sb.Append(a_inv[i, j]).Append("\t");
                }
            }

            sb.Append("\n\n");

            MessageBox.Show(sb.ToString());
        }






补充内容 (2024-12-18 21:25):
封贴,谢谢
 楼主| 发表于 2024-12-18 21:33:04 | 显示全部楼层
这里搞错了,导致结果不正确。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-23 10:45 , Processed in 0.124801 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表