矩阵求逆操作的复杂度分析(逆矩阵的复杂度分析)

这篇具有很好参考价值的文章主要介绍了矩阵求逆操作的复杂度分析(逆矩阵的复杂度分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

矩阵求逆操作的复杂度分析
逆矩阵的复杂度分析

1 背景

之前写过一篇关于矩阵复杂度分析的文章,没有想到阅读人数那么多。对于IT相关人士来说,从代码层次再结合基本数学知识,就能够很好地理解矩阵的复杂度如何计算得到和分析。其中一位读者提出“矩阵求逆的复杂度如何分析”。今天就来一起共同探讨一下,笔者知道,矩阵求逆有多种方法,这里就来探讨最基本的方式,其他优化方式,读者可以看完本篇博客后,自行分析,因为原理基本上差不是很多。本篇博客仅仅是抛砖引玉。

2 求逆操作分析

2.1 求逆矩阵基本原理

这里很多读者可以容易忽视掉,先复习一下。
( A ∣ E ) = ( E ∣ A − 1 ) (A|E) = (E| A^{-1}) (AE)=(EA1)
相信大家对这个公式都比较熟悉,即把原矩阵和一个单位矩阵对齐后,进行行列变化,就得到了单位矩阵,右边部分就算逆矩阵。

证明如下:
A − 1 ( A ∣ E ) = ( A − 1 A ∣ A − 1 E ) A^{-1}(A|E) = (A^{-1}A| A^{-1}E) A1(AE)=(A1AA1E)
= ( E ∣ A − 1 ) = (E| A^{-1}) =(EA1)
思考为什么呢?

因为:
A − 1 A = E A^{-1}A=E A1A=E,右乘 A − 1 A^{-1} A1后:
A − 1 E = A − 1 A^{-1}E=A^{-1} A1E=A1

故变化的桥梁就是存在 A − 1 A^{-1} A1

3 逆矩阵复杂度分析-高斯消元法

3.1 代码层次

/*
函数说明:将原矩阵a和一个单位矩阵E作成一个大矩阵(A,E),
用初等变换将大矩阵中的a变成E,则会得到(E,A^{-1})的形式
* */
void inverseMatrix(double arc[d][d], int n, double ans[d][d])//计算矩阵的逆
{
    /*
      d = n : 表示维度
      arc[d][d] : 原始矩阵,dxd
      ans[d][d] :  变化后的结果矩阵,dxd ,一开始初始化为单位矩阵
   */
    
	int i, j, k;//列
	double max, tempA, tempB, P;
	int max_num;
	double arcCopy[d][d];
	memcpy(arcCopy, arc, 288);
	for (i = 0; i < n; i++)
	{
		ans[i][i] = 1;
	}
	for (i = 0; i < n; i++)//第i列
	{
		max = fabs(arcCopy[i][i]);
		max_num = i;
		for (j = i + 1; j < n; j++)//选出主元
		{
			if (fabs(arcCopy[j][i]) > max)
			{
				max = fabs(arcCopy[j][i]);
				max_num = j;
			}
		}

		for (k = 0; k < n; k++)//交换行
		{
			tempA = arcCopy[i][k];
			arcCopy[i][k] = arcCopy[max_num][k];
			arcCopy[max_num][k] = tempA;
			tempB = ans[i][k];
			ans[i][k] = ans[max_num][k];
			ans[max_num][k] = tempB;
		}
		for (k = i + 1; k < n; k++)
		{
			P = arcCopy[k][i] / arcCopy[i][i];
			for (j = 0; j < n; j++)
			{
				arcCopy[k][j] = arcCopy[k][j] - arcCopy[i][j] * P;
				ans[k][j] = ans[k][j] - ans[i][j] * P;
			}
		}
	}
	for (i = 0; i < n; i++)//行
	{
		P = arcCopy[i][i];
		for (j = i; j < n; j++)
		{
			arcCopy[i][j] = arcCopy[i][j] / P;
		}
		for (j = 0; j < n; j++)
		{
			ans[i][j] = ans[i][j] / P;
		}
	}
	for (i = n - 1; i > 0; i--)
	{
		for (j = i - 1; j >= 0; j--)
		{
			for (k = 0; k < n; k++)
			{
				ans[j][k] = ans[j][k] - ans[i][k] * arcCopy[j][i];
			}
		}
	}
}

3.2 结果

逆矩阵时间复杂为:O(n^3)

开销代价最大是这里,

	for (i = n - 1; i > 0; i--)
	{
		for (j = i - 1; j >= 0; j--)
		{
			for (k = 0; k < n; k++)
			{
				ans[j][k] = ans[j][k] - ans[i][k] * arcCopy[j][i];
			}
		}
	}

4 逆矩阵复杂度分析-伴随矩阵

这个比较直接:
A − 1 = A ∗ / d e t ( A ) A^{-1} = A^{*}/det(A) A1=A/det(A)
先计算A的伴随矩阵,再计算A的行列式值。
前者的复杂度为: N ∗ O ( N ! ) N*O ( N ! ) NO(N!)
后者的复杂度为: N 2 ∗ O ( ( N − 1 ) ! ) N^2 ∗O((N−1)!) N2O((N1)!)

故使用伴随矩阵求解方式的复杂度为:
N ∗ O ( N ! ) + N 2 ∗ O ( ( N − 1 ) ! ) N*O ( N ! ) + N^2 ∗O((N−1)!) NO(N!)+N2O((N1)!)

ps:本博客只考虑基本的操作,不考虑优化处理
矩阵求逆的复杂度,有趣的机器学习,矩阵,线性代数,算法,矩阵求逆操作的复杂度分析,逆矩阵的复杂度分析文章来源地址https://www.toymoban.com/news/detail-799442.html

到了这里,关于矩阵求逆操作的复杂度分析(逆矩阵的复杂度分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数 --- 矩阵求逆的4种方法

             写在最前面: 在大多数情况下,我们学习线性代数的目的是为了求解线性方程组Ax=b, 而不是为了求A的逆 。         单就解方程而言, LU分解是最实用的算法。 只需按照A=LU——Ax=b,LUx=b——Ly=b(正向回代求得y),Ux=y(反向回代,最终求得x)的步骤求解即可。根本

    2023年04月08日
    浏览(39)
  • 矩阵计算复杂度(简洁版)(Computational complexity of matrix)

    This blog mainly focuses on the complexity of matrix calculation. I will introduce this topic in three parts: main results, analysis, and proof, code. Let ,  and invertible matrix . Then we have following computational complexity : (1)  ; (2)  ; (3) ; The usual computation for integer multiplication has a complexity of . This means that there is

    2023年04月13日
    浏览(49)
  • 四十五、时间/空间复杂度分析

    (1)看循环 一层循环为O(N),两层循环为O(n^2) 不包含输入输出所必须的循环 若两个循环,不互相嵌套,分别为m与n,则为O(m+n) (2)看递归 主定理,不适用太麻烦 例如快排与归并排序: 一共logn层,每一层是O(N)的时间复杂度,则总复杂度为O(nlogn) (3)一些看似为O(n^2),但实

    2024年02月13日
    浏览(79)
  • 如何分析算法的时间复杂度!

    算法时间复杂度定义 列举常见的时间复杂度以及如何计算:                           1.常数阶: 2.线性阶: 3.对数阶: 4.平方阶:         我们知道,学习数据结构和算法就是为了解决程序的“快”和“省”的问题,那么如何让代码运行得更快,让代码更省存储空间

    2024年01月16日
    浏览(46)
  • 算法与数据结构-复杂度分析

      算法的执行效率,粗略地讲,就是算法代码执行的时间。但是,如何在不运行代码的情况下,用“肉眼”得到一段代码的执行时间呢?   这里有段非常简单的代码,求 1,2,3…n 的累加和。现在,我就带你一块来估算一下这段代码的执行时间。   从 CPU 的角度来看,这

    2024年02月08日
    浏览(54)
  • NzN的数据结构--复杂度分析

             在算法设计中,我们先后追求以下两个目标。 找到问题解法 :在规定的输入范围内可靠地求得正确解。 寻求最优解法 :同一个问题可能存在多种解法,我们希望找到尽可能高效的算法。         我们的目标是设计 “既快又省” 的算法。只有有效地评估算

    2024年04月16日
    浏览(32)
  • 【读点论文】Separable Self-attention for Mobile Vision Transformers,通过引入隐变量将Q矩阵和K矩阵的算数复杂度降低成线性复杂度,分步计算注意力。

    移动视觉transformer(MobileViT)可以在多个移动视觉任务中实现最先进的性能,包括分类和检测。虽然这些模型的参数较少, 但与基于卷积神经网络的模型相比,它们具有较高的延迟 。MobileViT的主要效率瓶颈是transformer中的多头自我注意(MHA),相对于令牌(或补丁)的数量k,它需要

    2023年04月16日
    浏览(36)
  • C语言:杨氏矩阵中查找某数(时间复杂度小于O(N))

    有一个 数字矩阵 ( 二维数组 ), 矩阵的 每行从左到右是递增的 , 矩阵从上到下是递增的 , 请编写程序在这样的矩阵中查找某个数字是否存在, 要求: 时间复杂度小于O(N) 。                       =========================================================================            

    2024年02月15日
    浏览(48)
  • 算法时空复杂度分析:大O表示法

    算法题写完以后,面试官经常会追问一下你这个算法的时空复杂度是多少?(好像作为一名算法工程师,我日常码代码的过程中,并没有太注意这个,惭愧~但是找做后端开发的男票求证了一下,他们日常工作确实会去考虑这种问题)那么无论是为了应付面试,还是为了未来

    2024年03月22日
    浏览(40)
  • 【数据结构】时间复杂度(详细解释,例子分析,易错分析,图文并茂)

    🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【星辰大海】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰    目录 ⭐时间复杂度分类 🍔 方法 🎈平方阶 🎈立方阶  🎈对数阶 🍔例子 ✨常数时间复杂度 O(1) 🎈数组读取、索引和

    2023年04月20日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包