高斯消元法求矩阵的逆

逆矩阵:设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得: AB=BA=E。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。
矩阵求逆一般有两种方法,一个是伴随矩阵法,一个是初等变换法,也就是高斯消元法。这里主要讲高斯消元法的编程方法。
由条件AB=BA以及矩阵乘法的定义可知,矩阵A和B都是方阵。再由条件AB=I以及定理“两个矩阵的乘积的行列式等于这两个矩阵的行列式的乘积”可知,这两个矩阵的行列式都不为0。也就是说,这两个矩阵的秩等于它们的级数(或称为阶,也就是说,A与B都是n\times n方阵,且rank(A) = rank(B) = n)。换句话说,这两个矩阵可以只经由初等行变换,或者只经由初等列变换,变为单位矩阵。

因为对矩阵A施以初等行变换(初等列变换)就相当于在A的左边(右边)乘以相应的初等矩阵,所以我们可以同时对A和I施以相同的初等行变换(初等列变换)。这样,当矩阵A被变为I时,I就被变为A的逆阵B。

bool Gauss(float A[][N], float B[][N], int n)
{
    int i, j, k;
    float max, temp;
    float 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) ? (float)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] == 0)
        {
            printf("There is no inverse matrix!");
            return false;
        }
        //消去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;
                }
            }
        }
    }
    return true;
}

完整的测试代码如下:矩阵求逆

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
高斯是一种常用的解线性方程组和矩阵的方。在Matlab中,可以使用inv函数来矩阵矩阵。下面是一个使用高斯矩阵的Matlab代码示例[^1]: ```matlab function inv_matrix = gauss_inverse(matrix) n = size(matrix, 1); augmented_matrix = [matrix, eye(n)]; for i = 1:n % 将当前列的主元素调整为非零值 if augmented_matrix(i, i) == 0 for j = i+1:n if augmented_matrix(j, i) ~= 0 augmented_matrix([i, j], :) = augmented_matrix([j, i], :); break; end end end % 将当前列的主元素变为1 augmented_matrix(i, :) = augmented_matrix(i, :) / augmented_matrix(i, i); % 将当前列的其他元素变为0 for j = 1:n if j ~= i augmented_matrix(j, :) = augmented_matrix(j, :) - augmented_matrix(j, i) * augmented_matrix(i, :); end end end inv_matrix = augmented_matrix(:, n+1:end); end % 测试代码 matrix = [1, 2, 3; 4, 5, 6; 7, 8, 10]; inv_matrix = gauss_inverse(matrix); disp(inv_matrix); ``` 上述代码定义了一个名为gauss_inverse的函数,该函数接受一个矩阵作为输入,并返回其矩阵。在测试代码中,我们定义了一个3阶方阵matrix,并调用gauss_inverse函数解其矩阵。最后,使用disp函数输出矩阵的结果。 需要注意的是,高斯矩阵的过程中,如果某一列的主元素为0,则无进行元操作,表示该矩阵没有矩阵。在代码中,我们通过交换行的方式将主元素调整为非零值,以确保能够进行元操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值