求逆矩阵的方法

2023-05-16

一般求逆矩阵的方法有两种,伴随阵法和初等变换法。但是这两种方法都不太适合编程。伴随阵法的计算量大,初等变换法又难以编程实现。
适合编程的求逆矩阵的方法如下:
1、对可逆矩阵A进行QR分解:A=QR
2、求上三角矩阵R的逆矩阵
3、求出A的逆矩阵:A^(-1)=R^(-1)Q^(H)
以上三步都有具体的公式与之对应,适合编程实现。
C语言实现代码:

#include <stdio.h>
#include <math.h>

#define SIZE  8

double b[SIZE][SIZE]={0};//应该读作“贝尔塔”,注释中用B表示
double t[SIZE][SIZE]={0};//求和的那项
double Q[SIZE][SIZE]={0};//正交矩阵
double QH[SIZE][SIZE]={0};//正交矩阵的转置共轭
double R[SIZE][SIZE]={0};//
double invR[SIZE][SIZE]={0};//R的逆矩阵
double invA[SIZE][SIZE]={0};//A的逆矩阵,最终的结果
//={0};//
double matrixR1[SIZE][SIZE]={0};
double matrixR2[SIZE][SIZE]={0};

//double init[3][3]={3,14,9,6,43,3,6,22,15};
double init[8][8]={  
    0.0938  ,  0.5201 ,   0.4424  ,  0.0196  ,  0.3912  ,  0.9493 ,   0.9899  ,  0.8256,
    0.5254  ,  0.3477 ,   0.6878  ,  0.3309 ,   0.7691  ,  0.3276 ,   0.5144  ,  0.7900,
    0.5303  ,  0.1500 ,   0.3592  ,  0.4243 ,   0.3968  ,  0.6713 ,   0.8843  ,  0.3185,
    0.8611  ,  0.5861 ,   0.7363  ,  0.2703 ,   0.8085  ,  0.4386 ,   0.5880  ,  0.5341,
    0.4849  ,  0.2621 ,   0.3947  ,  0.1971 ,   0.7551  ,  0.8335 ,   0.1548  ,  0.0900,
    0.3935  ,  0.0445 ,   0.6834  ,  0.8217 ,   0.3774  ,  0.7689 ,   0.1999  ,  0.1117,
    0.6714  ,  0.7549 ,   0.7040  ,  0.4299 ,   0.2160  ,  0.1673 ,   0.4070  ,  0.1363,
    0.7413  ,  0.2428 ,   0.4423  ,  0.8878 ,   0.7904  ,  0.8620 ,   0.7487  ,  0.6787
};
/*/
函数名:int main()
输入:
输出:
功能:求矩阵的逆 pure C language
     首先对矩阵进行QR分解之后求上三角矩阵R的逆阵最后A-1=QH*R-1,得到A的逆阵。
作者:HLdongdong
*//////////////////////////////////////////////////////////////////////
int main()
{
    int i;//数组  行
    int j;//数组  列
    int k;//代表B的角标
    int l;//数组  列
    double dev;
    double numb;//计算的中间变量
    double numerator,denominator;
    double ratio;
    /////////////////求B/////////////////
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            b[j][i]=init[j][i];
        }
        for(k=0;k<i;++k)
        {
            if(i)
            {
                numerator=0.0;
                denominator=0.0;
                for(l=0;l<SIZE;++l)
                {
                    numerator+=init[l][i]*b[l][k];
                    denominator+=b[l][k]*b[l][k];
                }
                dev=numerator/denominator;
                t[k][i]=dev;
                for(j=0;j<SIZE;++j)
                {
                    b[j][i]-=t[k][i]*b[j][k];//t  init  =0  !!!
                }
            }
        }
    }
    ///////////////////对B单位化,得到正交矩阵Q矩阵////////////////////
    for(i=0;i<SIZE;++i)
    {
        numb=0.0;
        for(j=0;j<SIZE;++j)
        {
            numb+=(b[j][i]*b[j][i]);
        }
        dev=sqrt(numb);
        for(j=0;j<SIZE;++j)
        {
            Q[j][i]=b[j][i]/dev;
        }
        matrixR1[i][i]=dev;
    }
    /////////////////////求上三角R阵///////////////////////
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            if(j<i)
            {
                matrixR2[j][i]=t[j][i];
            }
            else if(j==i)   
            {
                matrixR2[j][i]=1;
            }
            else
            {
                matrixR2[j][i]=0;
            }
        }
    }
    mulMatrix(matrixR1,matrixR2,SIZE,SIZE,SIZE,R);
///////////////////////QR分解完毕//////////////////////////
    printf("QR分解:\n");
    printf("Q=\n");
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            printf("%2.4f    ",Q[i][j]);
        //  
        }
        printf("\n");
    }
    printf("R=\n");
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            printf("%2.4f    ",R[i][j]);
        //  
        }
        printf("\n");
    }
/////////////////////求R的逆阵//////////////////////////
    for(i=SIZE-1;i>=0;--i)
    {
        invR[i][i]=1/R[i][i];
        //R[i][i]=invR[i][i];
        if(i!=(SIZE-1))//向右
        {
            for(j=i+1;j<SIZE;++j)
            {
                invR[i][j]=invR[i][j]*invR[i][i];
                R[i][j]=R[i][j]*invR[i][i];
            }
        }
        if(i)//向上
        {
            for(j=i-1;j>=0;--j)
            {
                ratio=R[j][i];
                for(k=i;k<SIZE;++k)
                {
                    invR[j][k]-=ratio*invR[i][k];
                    R[j][k]-=ratio*R[i][k];
                }
            }   
        }
    }

///////////////////////////////////////////////////////

    printf("inv(R)=\n");
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            printf(" %2.4f  ",invR[i][j]);
        //  
        }
        printf("\n");
    }
////////////////////结果和MATLAB差一个负号,神马鬼????????/////////////////////
/////////////////////求QH//////////////////////////
    for(i=0;i<SIZE;++i)//实矩阵就是转置
    {
        for(j=0;j<SIZE;++j)
        {
            QH[i][j]=Q[j][i];
        }
    }
///////////////////////求A的逆阵invA/////////////////////////////

    mulMatrix(invR,QH,SIZE,SIZE,SIZE,invA);

    printf("inv(A)=\n");
    for(i=0;i<SIZE;++i)
    {
        for(j=0;j<SIZE;++j)
        {
            printf(" %2.4f  ",invA[i][j]);
        //  
        }
        printf("\n");
    }

///////////////////////结果与MATLAB的结果在千分位后有出入,但是负号都是对的^v^///////////////////////////
    return 0;
}

另附上矩阵乘法的子函数

/*/
函数名:void mulMatrix(double matrix1[SIZE][SIZE],double matrix2[SIZE][SIZE],int high1,int weight,int weight2,double mulMatrixOut[SIZE][SIZE])
输入:依次是 左矩阵,右矩阵,左矩阵高度,左矩阵宽度,右矩阵宽度,输出矩阵
输出:
功能:矩阵乘法
作者:HLdongdong
*//
void mulMatrix(double matrix1[SIZE][SIZE],double matrix2[SIZE][SIZE],int high1,int weight,int weight2,double mulMatrixOut[SIZE][SIZE])
{
    int i,j,k;
    for(i=0;i<high1;++i)
    {
        for(j=0;j<weight2;j++)
        {
            for(k=0;k<weight;++k)
            {
                mulMatrixOut[i][j]+=matrix1[i][k]*matrix2[k][j];
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

求逆矩阵的方法 的相关文章

  • matlab寻找函数对应的工具箱

    官方文档说函数对应的工具箱就在函数的介绍页面上方 xff0c 一开始没看懂什么意思 xff0c 后面知道怎么看了 红色方框内的即使函数所在工具箱的信息 例如这个finv函数就在Statistics and Machine Learning工
  • Collecting package metadata (current_repodata.json): done Solving environment: failed with repodata

    用 conda create name test python 61 3 4创建 python3 4 版本的 test环境报错 xff0c 然后在指定位置创建了一个文件 注意到这句话 xff0c 没有找到包 xff0c 换命令为 conda
  • navicat创建数据库后显示图标灰色,右键后无法新建数据库

    双击你的连接即可
  • unity_导出场景、包

    会发现以场景为单位的各种依赖都包括进来了
  • vscode + gdbserver 实现交叉调试

    0 前言 鉴于以下的痛点 xff0c 尝试了一下gdbserver配合vscode xff0c 发现十分好用 应用程序比较大 xff0c 依赖的库也很多 xff0c 设备上没有足够的存储空间 设备没有预留显示接口 在终端里面放断点调试效率低
  • Ubuntu14.04/Linux安装LLVM/clang-3.7(带有标准库 libc++,libc++abi)

    参考文章 https github com yangyangwithgnu use vim as ide 7 1 1 http blog csdn net firebird321 article details 48528569 一 不需源
  • 1.1小程序内置tabbar和自定义tabbar区别

    文章目录 内置tabbar自定义 tabbar创建文件夹 custom tab bar发现小程序自定义tabBar切换颜色总是比点击慢一步switchtab报错 switchTab fail page pages home pages me
  • 无基础小白 js 快速入门1.1

    文章目录 js的运行方法1js的运行方法2如何编写js代码如何运行js文件调试基本语法不一定用 结尾语句块注释 数据类型和变量Number字符串布尔值比较运算符null 和 undefined数组对象变量 区分动态语言和静态语言 js的运行
  • STM32F103寄存器方式点亮LED流水灯

    STM32F103寄存器方式点亮LED流水灯 一 程序设计思路1 GPIO 模式2 控制引脚输出电平3 开启外设时钟 二 编程实现1 C语言2 汇编语言3 实现 三 总结四 参考 以 STM32最小系统核心板 STM32F103C8T6 4
  • 看一看Rust,记录笔记:类型系统

    文章目录 第五章 xff1a 类型系统泛型泛型与容器泛型与结构体泛型与枚举泛型与函数泛型与方法 trait系统trait 定义与实现trait 作为参数impl Traittrait 约束 返回实现trait 的类型标准版常用trait格式
  • st-gcn复现

    1 st gcn执行命令 进入存储代码的目录 xff0c 激活pytorch环境 xff0c 之后运行命令 python main span class token punctuation span py demo span class t
  • 论文学习

    一 论文搜索 全球最大的预印本系统 https arxiv org 不懂为何有些网络是无法登录该网站 xff0c 有些却可以 sci hub xff08 擅长根据doi号下载文献 xff09 sci hub网址 xff1a https sc
  • 工控

    一 关注的网站 安全客 xff1a https www anquanke com 公司 北京九思易自动化软件公司 xff1a http controlease com 该公司和我想做的东西类似 xff0c 或者可以说是一样的 在SCADA系
  • 开发工具汇总

    转自帖子https www jincon com archives 488 网盘地址 xff1a 链接 xff1a https pan baidu com s 1J7UkIABiOaYSDRaGDJCmIg 提取码 xff1a p9vo
  • 远程控制工具——Centos7上向日葵安装使用(xy)

    最近发现国产软件向日葵远控确实很好用windows linux mac androdid ios 全平台支持确实很棒今天就给大家演示一下linux版的安装教程 首先在windows系统安装向日葵远控服务端用于控制其他远程主机 向日葵官网 x
  • opencv中的cv2.namedWindow()函数使用

    用法 xff1a cv2 namedWindow 窗口标题 默认参数 窗口大小可以改变 xff1a cv2 namedWindow 34 image 34 cv2 WINDOW NORMAL 或者cv2 namedWindow 39 ima
  • 常用shell脚本_失败自动重复下载

    常用shell脚本 失败自动重复下载 在网络不稳定时 xff0c 下载可能常常会中断或者失败 xff0c 通过脚本下载来实现下载失败之后 xff0c 重新下载 比如在github上下载一个包 xff1a span class token c
  • python中的range()函数

    python range 函数可以创建一个整数列表 xff0c 一般用在for循环中 函数语法 range start stop step 参数说明 xff1a start 计数从start开始 xff0c 默认是从0开始 stop 计数到
  • Is the docker daemon running?问题解决方法

    在运行 sudo docker ps a时出现 Cannot connect to the Docker daemon at unix var run docker sock Is the docker daemon running 此时已

随机推荐

  • docker端口映射或启动容器时报错Error response from daemon: Container is not running

    docker端口映射或启动容器时 xff1a docker exec it 7c5a2350c4cb bin bash 出现了错误 xff1a Error response from daemon Container 757d542c43e
  • GPU0和GPU1的区别

    1 GPU0就是我们俗称的集显 61 集成显卡是主板自带的显卡 2 GPU1就是独显独立显卡 xff0c 是单独的一张显卡性能一般是会比集显要高 一般在我们的电脑中 xff0c 有独立显卡的话 xff0c 就默认不会使用集显 xff0c 所
  • 进制转换

    二 八 十六转化为十进制 系数 xff1a 每一个位置上的数 xff0c 称为系数 基数 xff1a x进制 xff0c 基数就是x 权 xff1a 对数据系统从右往左进行编号 xff0c 并且从0开始 xff0c 每一个编号就是该系数所对
  • linux同时连接内外网的设置

    因为工作的原因 xff0c 经常会用有线网卡连接服务器进行配置 xff0c 无线网卡上外网 查看当前网关信息 pipci 64 ubuntu ip route show default via 192 168 2 1 dev enp2s0
  • ARM 汇编的立即数

    https blog csdn net a99778800 article details 6759825 ARM 汇编的立即数 大多数的数据处理指令和部分状态寄存器访问指令用到立即数 xff0c 在 ARM 中不是所有数都能用作立即数 x
  • Error: Invalid or corrupt jarfile xxxx-1.0-SNAPSHOT.jar

    解决方法 xff1a 1 请看 xff1a 395条消息 Linux jar报错处理 Exception in thread main java lang No Error Invalid or corrupt jarfile 错误 尝试打
  • IntelliJ IDEA配置maven远程仓库

    最近在搭建springMVC 43 mybatis的框架 xff0c 在添加jar包的时候出问题了 以前都是直接将jar包放到lib里面即可 xff0c 但是看到现在用maven的比较多 xff0c 就去配置maven 然后发现 xff0c
  • DNS & CDN & HTTPDNS 原理简析

    http www jianshu com p a73e963b63b1 DNS amp CDN amp HTTPDNS 原理简析 背景 xff1a 域名系统 DNS Domain Name System 作为域名和 IP 地址相互映射的一个
  • 图像拼接之MATLAB实现

    转自http www cnblogs com naive p 3579610 html 背景介绍 图像拼接是一项应用广泛的图像处理技术 根据特征点的相互匹配 xff0c 可以将多张小视角的图像拼接成为一张大视角的图像 xff0c 在广角照片
  • Centos重新安装 python2.7 和 yum

    由于Centos7自带的python大多是2 7版本 有时想装个python3的版本 于是把本来自带的yum一起给删了 这种情况下就要重装 python2 7 和 yum 一 删除Centos自带的python版本 强制删除已安装pytho
  • golang install 'gopls'

    前两天使用vs code写golang程序时 xff0c 突然提示gopls需要更新 xff0c 没有梯子的我 xff0c 很悲催的发现无法正常后取更新 xff0c 而没有这个工具的话 xff0c vs code的代码补齐和调转等功能完全无
  • 高校博士生待遇汇总

    笔者转载 xff0c 没有核实 xff0c 转自2011年的一份博客 xff0c 有兴趣的看看 xff0c 不喜勿喷 xff01 xff01 xff01 原文出自 xff1a http www 360doc com content 11 0
  • 国内从事计算机视觉(CV)领域的公司

    经常碰到朋友问我国内从事计算机视觉 xff08 CV xff09 领域的公司的发展情况 xff0c 产品情况 xff0c 甚至找工作等问题 xff0c 这里 xff0c 我给出自己收集的国内从事CV相关领域的公司网址及其主要产品 xff0c
  • 四川大学 opencv 人脸识别 手势识别 研究项目

    http v youku com v show id XNDAzMjkxOTAw html from 61 y1 2 1 92 3 3 1 1 1 1 2
  • 计算机领域著名的国际会议

    2013 3 7 理论计算机科学领域最顶级学术会议FOCS和STOC 1 IEEE Symposium on Foundations of Computer Science FOCS http ieee focs org 2 STOC Th
  • 人工智能的四个阶段

    人工智能的四个阶段 参考 人工智能 王万森 提起 人工智能 xff0c 从字面上看很容想到与之相对应的 自然智能 xff0c 自然智能基本的解释就是自然界本身具有的智能 xff0c 而人工智能就是人类所创造出来的智能 xff0c 在这里人类
  • 人工神经网络发展历程

    简要介绍人工神经网络发展五大历程 xff0c 都是具有标志性的 xff1a xff08 1 xff09 MP神经网络模型 xff0c 由此开始 xff0c 可以说神经网络始于 20世纪40年代 xff08 2 xff09 Hebb规则 xf
  • 柯西不等式证明(cauchy不等式)

    泛函分析中柯西不等式证明 xff1a
  • Time of flight cameras(TOF carmeras)

    TOF cameras Time Of flight 新型3D图像传感器 xff0c 该传感器使用红外线或者光脉冲来估计光线从发射到检测到的时间延迟来测量距离
  • 求逆矩阵的方法

    一般求逆矩阵的方法有两种 xff0c 伴随阵法和初等变换法 但是这两种方法都不太适合编程 伴随阵法的计算量大 xff0c 初等变换法又难以编程实现 适合编程的求逆矩阵的方法如下 xff1a 1 对可逆矩阵A进行QR分解 xff1a A 61