「已注销」 2022-12-16 23:50 采纳率: 100%
浏览 36
已结题

求下面问题的C语言代码

对一个二维矩阵进行求逆操作
输入形式:一个二维矩阵(随便输入一个二维矩阵,不能指定33矩阵或44矩阵)
输出形式:该矩阵的逆矩阵

  • 写回答

2条回答 默认 最新

  • 关注

    之前给你写过一个啊,那个题目下面的连接里就是n * n的。下面的代码中矩阵的阶数是可以输入的,根据输入的阶数输入矩阵,代码如下:

    //#define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    int InitialMatrix[110][110];//初始矩阵,即输入的矩阵
    int CurrentMatrix[110][110];//当前 矩阵 多用来表示当前余子式
    //打印矩阵matrix
    void print(int matrix[][110], int n)//打印矩阵 
    {
        int i, j;
        for ( i = 1; i <= n; i++)
        {
            for (j = 1; j < n; j++)
                printf("%d ", matrix[i][j]);
            printf("%d\n", matrix[i][j]);
        }
    }
    //得到矩阵matrix第numi行第numj列的余子式 并存入到CurrentMatrix中
    void GetCurrentMatrix(int numi, int numj, int matrix[][110], int MatrixSize)
    {
        //tempMatrix为临时矩阵
        int tempMatrix[110][110];
        int i, j;
        //先全部置为1
        for ( i = 0; i < MatrixSize + 10; i++)
        {
            for ( j = 0; j < MatrixSize + 10; j++)
                tempMatrix[i][j] = 1;
        }
        for ( i = 1; i <= MatrixSize - 1; i++)//求余子式矩阵 
        {
            for ( j = 1; j <= MatrixSize - 1; j++)
            {
                if (i >= numi && j < numj)
                    tempMatrix[i][j] = matrix[i + 1][j];
                else if (i >= numi && j >= numj)
                    tempMatrix[i][j] = matrix[i + 1][j + 1];
                else if (i < numi && j >= numj)
                    tempMatrix[i][j] = matrix[i][j + 1];
                else if (i < numi && j < numj)
                    tempMatrix[i][j] = matrix[i][j];
            }
        }
        //临时矩阵tempMatrix赋值给 当前矩阵CurrentMatrix
        for ( i = 0; i <= MatrixSize - 1; i++)
        {
            for ( j = 0; j <= MatrixSize - 1; j++)
                CurrentMatrix[i][j] = tempMatrix[i][j];
        }
    }
    //求当前行列式为CurrentMatrix时,CurrentMatrix的值。
    int GetMatrixValue(int MatrixSize)
    {
        int matrix[110][110];
        int i, j;
        int Matrixvalue = 0;//CurrentMatrix的值
        //赋值给matrix  交给matrix去计算 防止破坏CurrentMatrix
        for ( i = 1; i <= MatrixSize; i++)
        {
            for ( j = 1; j <= MatrixSize; j++)
                matrix[i][j] = CurrentMatrix[i][j];
        }
        //一阶二阶 行列式求值
        if (MatrixSize == 2)
            return matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2][1];
        else if (MatrixSize == 1)
            return matrix[1][1];
        else//高阶行列式求值
        {
            for ( i = 1; i <= MatrixSize; i++)
            {
                GetCurrentMatrix(1, i, matrix, MatrixSize);//得到第一行 第i列 的 当前余子式 CurrentMatrix 
                if (i % 2 == 1)//因为 是 行项为1 所以 列项i为奇数时  逆序数为偶数
                    Matrixvalue += matrix[1][i] * GetMatrixValue(MatrixSize - 1);
                else
                    Matrixvalue -= matrix[1][i] * GetMatrixValue(MatrixSize - 1);
            }
            return Matrixvalue;
        }
    }
    int gcd(int m, int n)//求逆矩阵时约分 
    {
        if (m < n)
            gcd(n, m);
        if (n == 0)
            return m;
        else
            return gcd(n, m % n);
    }
    //打印当前两个值相除得到的最简分数
    void final(int n, int m)
    {
        if (n * m < 0)
        {
            printf("-");
            final(fabs((double)n), fabs((double)m));
            return;
        }
        //printf("%d %d /%d\n",n,m,gcd(n,m));
        if (m == 1)
            printf("%d ", n);
        else if (n % m == 0)
            printf("%d ", n / m);
        else
            printf("%d/%d ", n / gcd(n, m), m / gcd(n, m));
    }
    int main()
    {
        int MatrixSize ;//矩阵的size
        int TransposeMatrixValue;
        int i = 0, j = 0;
        int MatrixValue = 0;
        int TransposeMatrix[110][110];//转置行列式
        printf("请输入矩阵的阶数:\n");//输入矩阵的规格 
        scanf("%d", &MatrixSize);
        //初始数组 全部 置为 1
        for ( i = 0; i < MatrixSize + 10; i++)
        {
            for (int j = 0; j < MatrixSize + 10; j++)
                InitialMatrix[i][j] = 1;
        }
        printf("输入%d*%d矩阵:\n", MatrixSize, MatrixSize);//输入矩阵 
        for ( i = 1; i <= MatrixSize; i++)
        {
            for ( j = 1; j <= MatrixSize; j++)
            {
                scanf("%d", &InitialMatrix[i][j]);
                CurrentMatrix[i][j] = InitialMatrix[i][j];//CurrentMatrix即 为当前矩阵 
            }
        }
    
        MatrixValue = GetMatrixValue(MatrixSize);//矩阵的值  
        for (i = 1; i <= MatrixSize; i++)//求转置行列式 
        {
            for (j = 1; j <= MatrixSize; j++)
            {
                TransposeMatrix[i][j] = InitialMatrix[j][i];
                CurrentMatrix[i][j] = TransposeMatrix[i][j];
            }
        }
    
        TransposeMatrixValue = GetMatrixValue(MatrixSize);
        //printf("%d\n", TransposeMatrixValue);
        if (TransposeMatrixValue == 0)
        {
            printf("该矩阵无逆矩阵!!!\n");
            return 0;//矩阵值为0,无逆矩阵 
        }
        printf("逆矩阵:\n");//输出逆矩阵 
        for ( i = 1; i <= MatrixSize; i++)
        {
            for ( j = 1; j <= MatrixSize; j++)
            {
                GetCurrentMatrix(i, j, TransposeMatrix, MatrixSize);//得到转置矩阵第i行第j列的 余子式 存入到CurrentMatrix里边
                if ((i + j) % 2 == 0)
                    final(GetMatrixValue(MatrixSize - 1), MatrixValue);
                else
                    final(-1 * GetMatrixValue(MatrixSize - 1), MatrixValue);
            }
            printf("\n");
        }
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月28日
  • 已采纳回答 12月20日
  • 创建了问题 12月16日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度