矩阵的逆 C 语言 算法一

矩阵的逆 C 语言 算法一 

 一.求解步骤

  1.矩阵必须是方阵(即矩阵的行列相等)。

  2.矩阵可逆的充分必要条件是其行列式的值不为零。

  3.求出矩阵的伴随矩阵。

  4.逆矩阵=行列式值的倒数*伴随矩阵。

 二.算法

  

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int i,j;
    int dimension;
    double deterValue=1;
    double **array,**deterArray, **companionMatrix, *temp;

    //声明函数
    void printfDouble2Dimension(int s, int n, double **array);
    double deter(int dimension, double **array);
    void copyDouble2Dimension(int s, int n, double **source, double **dest);
    void getCompanionMatrix(int dimension, double **array, double **companionMatrix);

    printf("请输入方阵的阶数N:");
    scanf("%d",&dimension);

    array=(double**)malloc(dimension*sizeof(double*));
    deterArray=(double**)malloc(dimension*sizeof(double*));
    companionMatrix =(double**)malloc(dimension*sizeof(double*));

    //循环输入方阵
    for(i=0;i<dimension;i++)
    {
        temp=(double*)malloc(dimension*sizeof(double));
        deterArray[i]=(double*)malloc(dimension*sizeof(double));
        companionMatrix[i]=(double*)malloc(dimension*sizeof(double));

        printf("请输入方阵的第%d行:",i+1);
        for(j=0;j<dimension;j++)
            scanf("%lf",temp+j);
        array[i]=temp;
    }
    //拷贝数组
    copyDouble2Dimension(dimension,dimension,array,deterArray);

    //打印方阵
    printf("方阵初等变换之前如下:\n");
    printfDouble2Dimension(dimension,dimension,array);
    deterValue = deter(dimension,deterArray);

    printf("方阵初等变换之后如下:\n");
    printfDouble2Dimension(dimension,dimension,deterArray);

    if(deterValue==0)
    {
        printf("方阵行列式值为零.\n");
        system("pause");
        return ;
    }
    printf("行列式的值:%.2lf\n",deterValue);
    //求伴随矩阵
    getCompanionMatrix(dimension,array,companionMatrix);

    //打印伴随矩阵
    printf("伴随矩阵如下:\n");
    printfDouble2Dimension(dimension, dimension, companionMatrix);
    system("pause");
}

//求伴随矩阵
void getCompanionMatrix(int dimension, double **array, double **companionMatrix)
{
    int i,j,k,l,m,n,o;
    int flag;//标志代数余子式的符号
    double **companionTemp;
    double deter(int dimension,double **array);

    companionTemp =(double**)malloc((dimension-1)*sizeof(double*));
    for(i=0;i<dimension-1;i++)
        companionTemp[i]=(double*)malloc((dimension-1)*sizeof(double));

    for(i=0;i<dimension;i++)
    {
        for(j=0;j<dimension;j++)
        {
            flag=(i+j)%2==0?1:-1;
            for(k=0,m=0;k<dimension;k++)
            {
                if(k==i)continue;
                for(l=0,n=0;l<dimension;l++)
                {
                    if(l==j)continue;
                    *(*(companionTemp+m)+n) = *(*(array+k)+l);
                    n++;
                }
                m++;
            }
            //第i行,第j列的代数余子式 赋值给第j行,第i列
            *(*(companionMatrix+j)+i) = flag * deter(dimension-1,companionTemp);
        }
    }
}

/*
 * calculate the determinant value
 */
double deter(int dimension,double **array)
{
    int i,j,k,l,b;
    int flag =1;
    double sum=1;
    double temp;
    for(i=0,j;i<dimension-1;i++)
    {
        j=i;
        if(*(*(array+i)+j)==0)
        {
            b=0;
            for(k=i+1;k<dimension;k++)
            {
                if(*(*(array+k)+j)!=0)//找到一行不为0的,然后换行
                {
                    for(l=j;l<dimension;l++)
                    {
                        temp=*(*(array+k)+l);
                        *(*(array+k)+l)= *(*(array+i)+l);
                        *(*(array+i)+l)=temp;
                    }
                    flag*=-1;
                    b=1;
                    break;
                }
            }
            if(!b)
            {
                return 0;
            }
            i--;
            continue;
        }
        for(;j<dimension-1;j++)
        {
            if(*(*(array+j+1)+i)==0)
                continue;
            temp = -*(*(array+j+1)+i)/ *(*(array+i)+i);
            for(k=i;k<dimension;k++)
                *(*(array+j+1)+k)+= *(*(array+i)+k)*temp;
        }
    }

    for(i=0;i<dimension;i++)
        sum*= *(*(array+i)+i);
    return sum*flag;
}

//打印数组
void printfDouble2Dimension(int s, int n, double **array)
{
    //printf("%d,%d",s,n);
    int i,j;
    for(i=0;i<s;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%6.2lf",*(*(array+i)+j));
        }
        printf("\n");
    }
}

//拷贝数组
void copyDouble2Dimension(int s, int n, double **source, double **dest)
{
    int i,j;
    for(i=0;i<s;i++)
    {
        for(j=0;j<n;j++)
        {
            *(*(dest+i)+j)=*(*(source+i)+j);
        }
    }
}

 三.程序截图

  1>  习题3.3-2(2)

  2>  习题3.3-2(3)

  3>  习题3.3-2(4)

  4>  习题3.3-2(5)

  5>  习题3.3-7(2).1

  6>  习题3.3-7(2).2

时间: 2024-08-23 12:42:27

矩阵的逆 C 语言 算法一的相关文章

数据结构与算法一

题目一:求1!+2!+-..+n! 的和的后6位,(注意n的范围) #include <iostream> using namespace std; const int MAX = 1000000; int getResu(int n) { int sum=0; int temp= 1; for(int i=1; i <= n; i++) { temp *= i; temp %= MAX; sum += temp; sum %= MAX; } return sum ; } int mai

HLG 1564 螺旋矩阵 (趣味C语言)

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1564 Description 对于给定的一个数n,要你打印n*n的螺旋矩阵. 比如n=3时,输出: 1 2 3 8 9 4 7 6 5 Input 多组测试数据,每个测试数据包含一个整数n(1<=n<=32) Output 对于每组测试数据,输出一个n*n的螺旋矩阵,定义在题目描述里. 在一组测试数据中,每个数占的字符宽度

分治题目 wikioi 1688 逆序数组 算导2-4

解题报告 算导上给了提示 用归并排序的代码进行修改来实现 思考后不难看出 归并排序的合并(merge)过程中 对数据进行了比较 1)如果数组L 的当前某元素大于数组R的当前元素,那么 由于L数组是有序的(升序) 因此 L数组当前元素以及他后面的所有元素都与R数组构成逆序对 2)我们的排序并不影响逆序对的数量 因为排序的时候不会改变当前被排序的数据和还未被处理的数据之间的位置关系(就是说 排序前在未处理元素左边的数据,排序后还在未处理元素左边,所以不改变逆序对的数量) 严格的证明待以后学好算法导论

《Linear Algebra and Its Applications》-矩阵的逆

矩阵的逆: 逆矩阵的定义: 类比于我们在研究实数的时候回去讨论一个数的倒数,对应的,在矩阵运算中,当AB = I的时候,A,B互称为逆矩阵,这里的I类似实数中的1,表示单位矩阵,即对角线是1其余位置是0的n x n的矩阵. 逆矩阵的唯一性: 逆矩阵是像实数的倒数一样唯一存在的么?我们不妨简单地证明一下.假设A的两个逆矩阵是B,C.根据定义我们有AB=I,AC=I,结合基本的矩阵运算法则,容易看到B=C=IA^-1,由此能够看到逆矩阵是唯一存在的. 如何求解逆矩阵: 如何求解逆矩阵这个问题其实能够

(数学概念)矩阵的逆、伪逆、左右逆,最小二乘,投影矩阵

主要内容: 矩阵的逆.伪逆.左右逆 矩阵的左逆与最小二乘 左右逆与投影矩阵 一.矩阵的逆.伪逆.左右逆 1.矩阵的逆 定义: 设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得: AB=BA=I. 则我们称B是A的逆矩阵,而A则被称为可逆矩阵. 可逆条件: A是可逆矩阵的充分必要条件是,即可逆矩阵就是非奇异矩阵.(当 时,A称为奇异矩阵) 性质: 矩阵A可逆的充要条件是A的行列式不等于0. 可逆矩阵一定是方阵. 如果矩阵A是可逆的,A的逆矩阵是唯一的. 可逆矩阵也被称为非奇异矩

大数据处理算法一:Bitmap算法

腾讯面试题:给20亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中并且所耗内存尽可能的少? 解析:bitmap算法就好办多了 所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个数据存不存在的. 例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示.那么就可以开一个int数组,一个int有32个位,就可以表示32个人.操作的时候可以使用位操作. 一,

Armadillo之求矩阵的逆(inverse)

求一个矩阵的逆(inverse or multiplicative inverse)使用矩阵的.i()方法或用inv()函数 m.i() //返回m的逆 1 若m不是方正的(square),则函数抛出std::logic_error异常. 2 如果m是奇异的(singular),则输出的矩阵将被重置,且抛出std::runtime_error异常 inv(m)   //返回m的逆 inv(A,m) //A被设为m的逆 1 若m不是方正的(square),则函数抛出std::logic_error

区块链入门教程以太坊源码分析fast sync算法一

区块链入门教程以太坊源码分析fast sync算法一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上.this PR aggregates a lot of small modifications to core, trie, eth and other packages to collectively implement the eth/63 fast synch

论如何求矩阵的逆?先看看基础芝士!

这是关于矩阵的一个bugblog (如果觉得格式看不下去请移步:洛咕) 矩阵求逆是个有趣(但暂且不知道有什么神奇运用)的东西, 不过矩阵这玩意儿貌似和线性代数以及向量之类的东西相关,所以学了绝对不亏 xiao 另外,本篇blog 并不一定毫无错误,甚至可能会有些理解上的小偏差,所以请各位观看的神仙及时指出好让作者修改精进,谢谢. 还有矩阵求逆的两种方法将会放在最后讲解 想要学会矩阵求逆的话,首先你得了解几个关于矩阵的概念以及名称的含义 (当然如果你知道这些概念的话可以直接往下跳) 基本概念 1.