算法介绍
矩阵求逆在3D程序中很常见,主要应用于求Billboard矩阵。按照定义的计算方法乘法运算,严重影响了性能。在需要大量Billboard矩阵运算时,矩阵求逆的优化能极大提高性能。这里要介绍的矩阵求逆算法称为全选主元高斯-约旦法。
高斯-约旦法(全选主元)求逆的步骤如下:
首先,对于 k 从 0 到 n - 1 作如下几步:
从第 k 行、第 k 列开始的右下角子阵中选取绝对值最大的元素,并记住次元素所在的行号和列号,在通过行交换和列交换将它交换到主元素位置上。这一步称为全选主元。
m(k, k) = 1 / m(k, k)
m(k, j) = m(k, j) * m(k, k),j = 0, 1, ..., n-1;j != k
m(i, j) = m(i, j) - m(i, k) * m(k, j),i, j = 0, 1, ..., n-1;i, j != k
m(i, k) = -m(i, k) * m(k, k),i = 0, 1, ..., n-1;i != k
最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复的原则如下:在全选主元过程中,先交换的行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。
实现(4阶矩阵)
float Inverse(CLAYMATRIX& mOut, const CLAYMATRIX& rhs){ CLAYMATRIX m(rhs); DWORD is[4]; DWORD js[4]; float fDet = 1.0f; int f = 1; for (int k = 0; k < 4; k ++) { // 第一步,全选主元 float fMax = 0.0f; for (DWORD i = k; i < 4; i ++) { for (DWORD j = k; j < 4; j ++) { const float f = Abs(m(i, j)); if (f > fMax) { fMax = f; is[k] = i; js[k] = j; } } } if (Abs(fMax) < 0.0001f) return 0; if (is[k] != k) { f = -f; swap(m(k, 0), m(is[k], 0)); swap(m(k, 1), m(is[k], 1)); swap(m(k, 2), m(is[k], 2)); swap(m(k, 3), m(is[k], 3)); } if (js[k] != k) { f = -f; swap(m(0, k), m(0, js[k])); swap(m(1, k), m(1, js[k])); swap(m(2, k), m(2, js[k])); swap(m(3, k), m(3, js[k])); } // 计算行列值 fDet *= m(k, k); // 计算逆矩阵 // 第二步 m(k, k) = 1.0f / m(k, k); // 第三步 for (DWORD j = 0; j < 4; j ++) { if (j != k) m(k, j) *= m(k, k); } // 第四步 for (DWORD i = 0; i < 4; i ++) { if (i != k) { for (j = 0; j < 4; j ++) { if (j != k) m(i, j) = m(i, j) - m(i, k) * m(k, j); } } } // 第五步 for (i = 0; i < 4; i ++) { if (i != k) m(i, k) *= -m(k, k); } } for (k = 3; k >= 0; k --) { if (js[k] != k) { swap(m(k, 0), m(js[k], 0)); swap(m(k, 1), m(js[k], 1)); swap(m(k, 2), m(js[k], 2)); swap(m(k, 3), m(js[k], 3)); } if (is[k] != k) { swap(m(0, k), m(0, is[k])); swap(m(1, k), m(1, is[k])); swap(m(2, k), m(2, is[k])); swap(m(3, k), m(3, is[k])); } } mOut = m; return fDet * f;}
比较
原算法 原算法(经过高度优化) 新算法
加法次数 103 61 39
乘法次数 170 116 69
需要额外空间 16 * sizeof(float) 34 * sizeof(float) 25 * sizeof(float)
结果不言而喻吧。
分享到:
相关推荐
GPU 上循环矩阵的快速求逆算法 在高性能计算领域,矩阵求逆操作是非常重要的一类计算任务。随着计算机科学和技术的发展,Graphics Processing Unit(GPU)逐渐成为高性能计算的主要力量。GPU 的并行计算能力和高...
### 矩阵求逆的最简单的算法 在数学与计算机科学领域中,...这种算法适用于编程过程中需要快速求解矩阵逆的情况,特别是在资源有限或性能敏感的应用场景中。理解并掌握这种方法对于进行高效的矩阵运算具有重要意义。
[理学]大型矩阵快速求逆算法的研究.doc
因此,文章提出了利用伪逆公式转换将非方阵问题转化为求解n维共轭对称复数矩阵逆的问题。 3. **改进型Cholesky分解法** 改进型Cholesky分解法能够有效处理最小二乘问题中的伪逆问题,其相较于传统Cholesky分解法在...
全选主元高斯-约旦法是实现矩阵求逆的一种快速算法。此方法的核心在于通过全选主元,也就是在矩阵的每一列中选取一个最大绝对值的元素作为主元,这样可以有效减少在求解过程中的数值误差。紧接着,通过行变换和列...
本篇将详细讲解如何使用C语言来实现复数矩阵的求逆,并探讨相关的算法和数据结构。 首先,复数是由实部和虚部组成的数,形式为`a + bi`,其中`a`是实部,`b`是虚部,`i`是虚数单位,满足`i² = -1`。在C语言中,...
矩阵求逆的优点是能够快速解决线性系统,计算矩阵的行列式和特征值等。其缺点是需要大量的计算资源,且在大规模矩阵上计算时间较长。 结论 ---------- 本文展示了如何使用C#语言编写矩阵求逆代码,特别是用于三阶...
在C语言中,实现矩阵求逆通常涉及高斯消元法或LU分解等算法。高斯消元法通过一系列行变换将矩阵转化为上三角形矩阵,然后通过回代求得逆矩阵。而LU分解则是将矩阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积,再...
本文将深入探讨“矩阵求逆”这一主题,结合“矩阵求逆测试”的程序描述,我们将讨论LU分解和快速计算求逆算法,并介绍一个实用的矩阵类。 首先,矩阵求逆是指找到一个矩阵A的逆矩阵A^(-1),使得AA^(-1) = A^(-1)A =...
在线性代数中,LDL^H分解是将一个矩阵分解为一个下三角矩阵(L)与一个对角矩阵(D)的过程。由于D是对角矩阵,那么其逆矩阵就等于其...该算法计算复杂度远低于其他常见的方法,因为其利用了厄米特矩阵的共轭对称性质。
通过上述算法,不仅可以显著降低求解分块五对角矩阵逆所需的计算复杂度,还可以提高求解效率。相比于传统方法所需的\(O(n^3)\)次\(m\)阶矩阵运算,该快速算法仅需\(O(n^2)\)次\(m\)阶矩阵运算,极大地提高了计算效率...
为了降低广义范德蒙矩阵求逆的计算复杂度,本文提出了一种快速算法。该算法的核心思想是利用递推关系来逐步计算逆矩阵的各个元素。通过这种方法,计算复杂度可以降低到\(O(n^2)\)级别,相较于传统的\(O(n^3)\)方法有...
对于大型矩阵,直接使用高斯消元法或其他通用方法可能会非常耗时,因此需要开发针对此类矩阵特性的快速算法。 快速算法通常基于迭代或分解策略,将大问题分解为更小、更易处理的部分。例如,可以使用LU分解、QR分解...
文章重点研究了两种矩阵求逆方法:Cholesky分解算法和块快速傅里叶变换(Block Fast Fourier Transform, FFT)算法,并通过理论分析与计算机仿真进行了对比。 #### 矩阵求逆算法研究 **1.1 Cholesky分解** ...
在VC++环境中,矩阵求逆是一项常见的线性代数计算任务。这个程序示例通过创建一个名为`wgb`的类来实现矩阵的输入、显示和求逆操作。以下是程序中涉及的重要知识点: 1. **类(Class)**:类是C++中的面向对象编程...
- **数值分析**:求解线性方程组时,可以通过计算系数矩阵的逆矩阵来快速获得解。 - **计算机图形学**:在变换矩阵的操作中,逆矩阵用于撤销或反向应用这些变换。 - **控制理论**:在控制系统的设计中,逆矩阵常用于...
矩阵的快速求逆算法在现代计算机...总的来说,大型矩阵快速求逆算法的研究对于提升计算效率、优化资源利用和解决实际问题具有重大意义。随着互联网技术的进步,这一领域的研究将继续深化,推动矩阵运算的边界不断拓展。
总的来说,大型矩阵快速求逆算法的研究涉及到数值线性代数、优化和并行计算等多个CS领域的知识。通过选择合适的算法和利用MATLAB的强大功能,可以有效地解决大规模矩阵的逆运算问题,提高计算效率,同时降低内存消耗...
使用MINVERSE函数,用户可以快速计算矩阵的逆矩阵。下面是一个简单的示例: 1. 输入待求逆矩阵:在Excel表格中输入待求逆矩阵。 2. 在空白区选择一存放逆矩阵的区域,与待求逆矩阵大小相同。 3. 保持该区域为选中...