c语言求逆矩阵-高斯消元法

/**
*A表示输入的矩阵
*B表示输出的逆矩阵
*n表示秩的大小
*/
void Gauss(double A[][N], double B[][N], int n)//这里的n指的是n*n的方阵中的n
{
    int i, j, k;
    double max, temp;
    double t[N][N];                //临时矩阵
    //将A矩阵存放在临时矩阵t[n][n]中
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            t[i][j] = A[i][j];
        }
    }
    //初始化B矩阵为单位阵
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            B[i][j] = (i == j) ? (double)1 : 0;
        }
    }
    for (i = 0; i < n; i++)
    {
        //寻找主元
        max = t[i][i];
        k = i;
        for (j = i + 1; j < n; j++)
        {
            if (fabs(t[j][i]) > fabs(max))
            {
                max = t[j][i];
                k = j;
            }
        }
        //如果主元所在行不是第i行,进行行交换
        if (k != i)
        {
            for (j = 0; j < n; j++)
            {
                temp = t[i][j];
                t[i][j] = t[k][j];
                t[k][j] = temp;
                //B伴随交换
                temp = B[i][j];
                B[i][j] = B[k][j];
                B[k][j] = temp;
            }
        }
        //判断主元是否为0, 若是, 则矩阵A不是满秩矩阵,不存在逆矩阵
        if (t[i][i] == (double)0)
        {
            printf("There is no inverse matrix!");
            system("pause");
            exit(0);
        }
        //消去A的第i列除去i行以外的各行元素
        temp = t[i][i];
        for (j = 0; j < n; j++)
        {
            t[i][j] = t[i][j] / temp;        //主对角线上的元素变为1
            B[i][j] = B[i][j] / temp;        //伴随计算
        }
        for (j = 0; j < n; j++)        //第0行->第n行
        {
            if (j != i)                //不是第i行
            {
                temp = t[j][i];
                for (k = 0; k < n; k++)        //第j行元素 - i行元素*j列i行元素
                {
                    t[j][k] = t[j][k] - t[i][k] * temp;
                    B[j][k] = B[j][k] - B[i][k] * temp;
                }
            }
        }
    }
}
//测试 求矩阵逆 正确
void test16()
{
    double matrix[3][3] = { {7.5518 ,9.1435,10.1359},
        {9.1435,11.5362,13.1982},
        {10.1359,13.1982,15.4540} };
    double newMat[3][3];
    Gauss(matrix, newMat, 3);//3*3矩阵
    /***输出函数****/
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%f  ", newMat[i][j]);
        }
        printf("\n");
    }
}

你可能感兴趣的:(c语言,矩阵,开发语言)