矩阵求逆算法及程序实现(C++)

  在做课题时,遇到了求多项式问题,利用了求逆方法。矩阵求逆一般使用简单的算法,还有快速算法 如全选主元高斯-约旦消元法,但本文程序主要写了简单的矩阵求逆算法定义法之伴随矩阵求逆公式如下,其中A可逆:

                ,其中伴随矩阵。。

  1.给定一个方阵,非奇异(不是也可,程序有考虑);

  2.由矩阵得到其行列式,求其值如|A|;

  3.求其伴随矩阵

  4.得到其逆矩阵。

主要函数如下:

 1 //得到给定矩阵src的逆矩阵保存到des中。
 2 bool GetMatrixInverse(double src[N][N],int n,double des[N][N])
 3 {
 4     double flag=getA(src,n);
 5     double t[N][N];
 6     if(flag==0)
 7     {
 8         return false;
 9     }
10     else
11     {
12         getAStart(src,n,t);
13         for(int i=0;i<n;i++)
14         {
15             for(int j=0;j<n;j++)
16             {
17                 des[i][j]=t[i][j]/flag;
18             }
19
20         }
21     }
22
23
24     return true;
25
26 }

计算|A|:

 1 //按第一行展开计算|A|
 2 double getA(double arcs[N][N],int n)
 3 {
 4     if(n==1)
 5     {
 6         return arcs[0][0];
 7     }
 8     double ans = 0;
 9     double temp[N][N]={0.0};
10     int i,j,k;
11     for(i=0;i<n;i++)
12     {
13         for(j=0;j<n-1;j++)
14         {
15             for(k=0;k<n-1;k++)
16             {
17                 temp[j][k] = arcs[j+1][(k>=i)?k+1:k];
18
19             }
20         }
21         double t = getA(temp,n-1);
22         if(i%2==0)
23         {
24             ans += arcs[0][i]*t;
25         }
26         else
27         {
28             ans -=  arcs[0][i]*t;
29         }
30     }
31     return ans;
32 }

计算伴随矩阵:

 1 //计算每一行每一列的每个元素所对应的余子式,组成A*
 2 void  getAStart(double arcs[N][N],int n,double ans[N][N])
 3 {
 4     if(n==1)
 5     {
 6         ans[0][0] = 1;
 7         return;
 8     }
 9     int i,j,k,t;
10     double temp[N][N];
11     for(i=0;i<n;i++)
12     {
13         for(j=0;j<n;j++)
14         {
15             for(k=0;k<n-1;k++)
16             {
17                 for(t=0;t<n-1;t++)
18                 {
19                     temp[k][t] = arcs[k>=i?k+1:k][t>=j?t+1:t];
20                 }
21             }
22
23
24             ans[j][i]  =  getA(temp,n-1);
25             if((i+j)%2 == 1)
26             {
27                 ans[j][i] = - ans[j][i];
28             }
29         }
30     }
31 }

  这三个函数组成了求逆矩阵的步骤,笔者调用并成功运用,无错,在此共勉。如有问题,请留言。谢谢

  另有其他矩阵求逆好算法及代码请大家共享。

时间: 2024-10-11 19:24:01

矩阵求逆算法及程序实现(C++)的相关文章

1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)

1014 C语言文法定义与C程序的推导过程  程序:冒泡算法C程序(语法树)1 阅读并理解提供给大家的C语言文法文件. 2 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 3 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图(完整图片) 1 #include <stdio.h> 2 3 main() 4 { 5 int i,j,temp; 6 int a[10]; 7 8 for(i=0;i<10;i++) 9 scanf

避免死锁的银行家算法C++程序实现

 本篇博文为追忆曾经写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家算法的计算机程序化,使其更实用.同时也加深了有关自愿申请.避免死锁等概念,体会避免死锁的实际实现过程与方法. 要求: 1.设定进程p对各类资源r合理的最大需求max及初值确定:2.设定系统提供资源初始状况allocation:3.设定每次某个进程对各类资源的申请表示need:4.编制C++程序,基于

堆排序算法---《程序员必须知道的10大基础实用算法及其讲解》

> 原帖地址:http://www.oschina.net/question/1397765_159365 快速排序算法的基本特性: 时间复杂度:O(N * logN) 堆排序为不稳定排序,不适合记录较少的排序. var arr = [], count = 100, i = 0, parentIndex, exeCount = 0, startTime = + new Date(), stackSort = function(a){ if(a.length === 1) return a; va

转发---十大编程算法助程序员走上大神之路

十大编程算法助程序员走上大神之路 本文为转发,源地址:http://linux.cn/article-3613-1.html 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and co

改进的二值图像像素标记算法及程序实现(含代码)

笔者实现了一个论文里面的算法程序,论文(可以网上搜索到,实在搜不到可以联系笔者或留下邮箱发给你)讲解比较到位,按照作者的思路写完了代码,测试效果很好,在此分享一下算法思路及实现代码. 此算法优于一般的像素标记算法,只需扫描一遍就可以得出图像边界.面积等等,大大减少了计算量. 算法描述: 一.全图扫描 对二值图像全图扫描,左到右,上到下,一遇到像素边界就进行判断.像素边界指当前像素灰度为1,其他8领域至少有一个灰度值为0. 1.先依次判断当前像素(i,j)的左侧.左上侧.上侧像素和右上侧像素是否被

十大编程算法助程序员走上大神路

算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元素,称为 "

java程序员到底该不该了解一点算法(一个简单的递归计算斐波那契数列的案例说明算法对程序的重要性)

为什么说 “算法是程序的灵魂这句话一点也不为过”,请看下面这个简单的案例 1 package recursion; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import org.junit.Test; 7 8 /** 9 * @author: MengXianman 10 * @creationTime: 2017年11月27日 上午9:47:51 11 * @description: 斐波那契数列结合备忘录算法的简单使

PHP用抛物线的模型实现微信红包生成算法的程序源码

<?php /* *Author:Kermit *Time:2015-8-26 *Note:红包生成随机算法 */ header("Content-type:text/html;charset=utf-8"); date_default_timezone_set('PRC'); #红包生成的算法程序 class reward { public $rewardMoney; #红包金额.单位元 public $rewardNum; #红包数量 public $scatter; #分散

十大编程算法助程序员走上大神之路

概述:编程算法,是完成程序逻辑的主要途径.本文推荐十大编程算法,有利于程序员的编程逻辑. 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(lis