矩阵求逆(c++)

矩阵求逆(c++)矩阵求逆 c 标签 空格分隔 技术博客简要过程介绍方法的名称是 Gauss Jordan orreducedrow eliminationm 设单位对角矩阵为 I 则 MM 1 IMM 1 I 主要过程为 摆一个相同大小的对角矩阵在旁边 将原矩阵变成对角矩阵的过程中 对对角矩阵施以相同的变化 原理为 对矩阵施以特定变化等同于对矩阵进行线性计算 实现过程第一步 准备阶段

矩阵求逆(c++)

标签(空格分隔): 技术博客


简要过程介绍

方法的名称是“Gauss-Jordan (or reduced row) elimination method”。

设单位对角矩阵为I,则 MM1=I

主要过程为,摆一个相同大小的对角矩阵在旁边,将原矩阵变成对角矩阵的过程中,对对角矩阵施以相同的变化。原理为,对矩阵施以特定变化等同于对矩阵进行线性计算。

实现过程

第一步:

准备阶段:进行 行与行的变换,使矩阵对角位的数值非0。

代码为一个4*4的矩阵求逆(4*4矩阵在图形学中用途最广)

int i, j, k; Matrix44 
   
     s; Matrix44 
    
      t(* 
     this); 
     for (i = 
     0; i < 
     3; i++) { 
      
     //找到下三角每列的绝对最大值 
     int pivot = i; T pivotsize = t[i][i]; 
     if (pivotsize < 
     0)pivotsize = -pivotsize; 
     for (j = i + 
     1; j < 
     4; j++) { T tmp = t[j][i]; 
     if (tmp < 
     0)tmp = -tmp; 
     if (tmp > pivotsize) { pivot = j; pivotsize = tmp; } } 
     if (pivotsize == 
     0) { 
     //can not inverse 
     return Matrix44(); } 
     if (pivot != i) 
     //交换两行,使对角位的值为该列最大 { 
     for (j = 
     0; j < 
     4; j++) { T tmp; tmp = t[i][j]; t[i][j] = t[pivot][j]; t[pivot][j] = tmp; tmp = s[i][j]; s[i][j] = s[pivot][j]; s[pivot][j] = tmp; } } 
     
   
第二步:

将下三角所有数值置为0。

//将下三角值设定为0 for (j = i + 1; j < 4; j++) { T f = t[j][i] / t[i][i]; for (k = 0; k < 4; k++) { t[j][k] -= t[i][k] * f; s[j][k] -= s[i][k] * f; } } }
第三步:


  • 先判断现在是否有对角位为0 的情况,如果有,则证明矩阵不可逆。因为如果此时对角位为0,则该行一定可以被其他行表示。
  • 再将对角位置为1:
for (i = 3; i >= 0; i--) { T f; f = t[i][i]; if (f == 0)return Matrix44           (); for (j =      0; j <      4; j++) {//将对角位置为      1 t[i][j] /= f; s[i][j] /= f; }      for (j = 0; j < i; j++) { f = t[j][i]; for (k = 0; k < 4; k++) { t[j][k] -= f*t[i][k]; s[j][k] -= f*s[i][k]; } } }

完整代码如下:

 int i, j, k; Matrix44         s; Matrix44           t(*      this);      for (i =      0; i <      3; i++) {            //找到下三角每列的绝对最大值      int pivot = i; T pivotsize = t[i][i];      if (pivotsize <      0)pivotsize = -pivotsize;      for (j = i +      1; j <      4; j++) { T tmp = t[j][i];      if (tmp <      0)tmp = -tmp;      if (tmp > pivotsize) { pivot = j; pivotsize = tmp; } }      if (pivotsize ==      0) {      //can not inverse      return Matrix44(); }      if (pivot != i)      //交换两行,使对角位的值为该列最大 {      for (j =      0; j <      4; j++) { T tmp; tmp = t[i][j]; t[i][j] = t[pivot][j]; t[pivot][j] = tmp; tmp = s[i][j]; s[i][j] = s[pivot][j]; s[pivot][j] = tmp; } }      //将下三角值设定为0      for (j = i +      1; j <      4; j++) { T f = t[j][i] / t[i][i];      for (k =      0; k <      4; k++) { t[j][k] -= t[i][k] * f; s[j][k] -= s[i][k] * f; } } }      for (i =      3; i >=      0; i--) { T f; f = t[i][i];      if (f ==      0)      return Matrix44             ();       for (j =       0; j <       4; j++) {              //将对角位置为1 t[i][j] /= f; s[i][j] /= f; }       for (j =       0; j < i; j++) { f = t[j][i];       for (k =       0; k <       4; k++) { t[j][k] -= f*t[i][k]; s[j][k] -= f*s[i][k]; } } }       return s; }               

代码来源:

https://www.scratchapixel.com

注:这是一个图形学学习的网站

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214830.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午3:21
下一篇 2026年3月18日 下午3:21


相关推荐

  • numpy创建数组

    numpy创建数组数组的操作list======特殊的数组数组和列表的区别:数组:存储的时同一种数据类型;list:容器,可以存储任意数据类型;一维数组和数组的计算:#一维数组和数组的计算a=[1,2,3,4]b=[2,3,4,5]#一维数组相加add=lambdax:x[0]+x[1]#[(1,2),(2,3),(3,4),(4,…

    2022年6月7日
    33
  • uml分析考勤系统设计

    uml分析考勤系统设计写在开头的话 本文章是参考 uml 大战需求分析 的案例进行总结分析 引导完成需求设计的整个流程 如需详细介绍 请阅读相关资料 一 需求背景针对小型公司进行考勤系统的规划设计 由于之前的考勤系统出现年假计算有误 请假流程繁琐 工资计算错误等 为了解决这些问题 公司领导提出上线考勤系统的需求 二 需求调研 amp 分析针对该系统涉及到的人员进行调研 明确每类角色需要解决的问题 根据调研结果完成用户故事的梳理以及用例图的设计 以下截图为调研人员所期望系统实现的需求 需求人员需要根据

    2026年3月18日
    2
  • 字符串中查找子串_cstring查找子字符串

    字符串中查找子串_cstring查找子字符串子串查询首先,我们来定义两个概念,主串和模式串。我们在字符串A中查找字符串B,则A就是主串,B就是模式串。我们把主串的长度记为n,模式串长度记为m。由于是在主串中查找模式串,因此,主串的长度肯定比模式串长,n>m。因此,字符串匹配算法的时间复杂度就是n和m的函数。假设要从主串s=“goodgoogle”中找到t=“google”子串。根据我们的思考逻辑,则有:首先,我们从主串s第1位开始,判断s的第1个字符是否与t的第1个字.

    2022年8月21日
    5
  • linux反编译apk_反编译apk工具

    linux反编译apk_反编译apk工具[TOC]今日需参考ROM厂商部分APK,故查阅走坑以做记录资源文件如参考图片、布局之类,可以直接将APK解压出来的目录结构如下:├──AndroidManifest.xml├──META-INF│├──CERT.RSA│├──CERT.SF│└──MANIFEST.MF├──res│├──anim│├──animator│├─

    2026年1月19日
    5
  • 🚀彻底改写Claude Code编程方式!从提示词工程到上下文工程!AI编程能力提升百倍!从需求分析到代码生成全自动化!保姆级实战教程!支持Windows!零

    🚀彻底改写Claude Code编程方式!从提示词工程到上下文工程!AI编程能力提升百倍!从需求分析到代码生成全自动化!保姆级实战教程!支持Windows!零

    2026年3月15日
    2
  • spring boot 加密_springboot 密码加密

    spring boot 加密_springboot 密码加密首先介绍一下jasypt的使用方法可以参考下面这篇文章:Get史上最优雅的加密方式!没有之一!版本对应的坑使用的时候还是遇到一个坑,就是jasypt的版本与springboot版本存在对应情况。可以看到jasypt是区分java7和java8的,也存在依赖spring版本的情况。自己尝试了一下在使用jasypt-spring-boot-starter的前提下 j…

    2026年4月14日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号