LU分解的矩阵逆运算

标签: matrixoutput算法inistring
2010-11-07 00:24 2440人阅读 评论(0) 收藏 举报
分类:
信号MATLAB(1) C/C++(6)
算法名称:矩阵求逆(基于LU分解法)
 
LU分解算法评价:
       LU分解大约需要执行N3/3次内层循环(每次包括一次乘法和一次加法)。这是求解一个(或少量几个)右端项时的运算次数,它要比Gauss-Jordan消去法快三倍,比不计算逆矩阵的Gauss-Jordan法快1.5倍。
       当要求解逆矩阵时,总的运算次数(包括向前替代和回代部分)为N3,与Gauss-Jordan法相同。
 
算法描述:
简言之,我们只需对原始矩阵进行一次LU分解,然后变换右端向量b就可以了,即设我们的原始矩阵为4×4阶方阵,那么我们的b依次
然后重新排列成的矩阵就是逆矩阵了。
 
运行示例:
Origin matrix:
 | 0.0 2.0 0.0 1.0 |
 | 2.0 2.0 3.0 2.0 |
 | 4.0 -3.0 0.0 1.0 |
 | 6.0 1.0 -6.0 -5.0 |
-----------------------------------------------
Its inverse matrix:
 | -0.025641025641025623 0.1282051282051282 0.08974358974358977 0.0641025641025641 |
 | 0.17948717948717946 0.10256410256410259 -0.12820512820512822 0.05128205128205129 |
 | -0.5299145299145299 0.3162393162393163 -0.14529914529914528 -0.00854700854700854 |
 | 0.6410256410256411 -0.20512820512820518 0.25641025641025644 -0.10256410256410257 |
-----------------------------------------------
示例程序:
packagecom.nc4nr.chapter02.matrixinver;

publicclassMatrixInver {

    double[][] a = {
            {0.0, 2.0, 0.0, 1.0},
            {2.0, 2.0, 3.0, 2.0},
            {4.0, -3.0, 0.0, 1.0},
            {6.0, 1.0, -6.0, -5.0}
    };
    
    double[] b = null;
    
    int anrow = 4;
    double[] vv = new double[anrow];
    int[] indx = new int[anrow];
    
    private void lucmp() {
        int n = anrow, imax = 0;
        for (int i = 0; i < n; i++) {
            double big = 0.0;
            for (int j = 0; j < n; j++) {
                double temp = Math.abs(a[i][j]);
                if (temp > big) big = temp;
            }
            vv[i] = 1.0 / big;
        }
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < j; i++) {
                double sum = a[i][j];
                for (int k = 0; k < i; k++) sum -= a[i][k] * a[k][j];
                a[i][j] = sum;
            }
            double big = 0.0;
            for (int i = j; i < n; i++) {
                double sum = a[i][j];
                for (int k = 0; k < j; k++) sum -= a[i][k] * a[k][j];
                a[i][j] = sum;
                double dum = vv[i] * Math.abs(sum);
                if (dum >= big) {
                    big = dum;
                    imax = i;
                }
            }
            if (j != imax) {
                for (int i = 0; i < n; i++) {
                    double mid = a[imax][i];
                    a[imax][i] = a[j][i];
                    a[j][i] = mid;
                }
                double mid = vv[j];
                vv[j] = vv[imax];
                vv[imax] = mid;
            }
            indx[j] = imax;
            if (j != n - 1) {
                double dum = 1.0/a[j][j];
                for (int i = j + 1; i < n; i++) a[i][j] *= dum; 
            }
        }
    }
    
    private void lubksb(double[] b) {
        int n = anrow, ii = 0;
        // y
        for (int i = 0; i < n; i++) {    
            int ip = indx[i];        
            double sum = b[ip];
            b[ip] = b[i];
            if (ii != 0)
                for (int j = ii - 1; j < i; j++) sum -= a[i][j] * b[j];
            else
                ii = i + 1;
            b[i] = sum;
        }
        // x
        for (int i = n - 1; i >= 0; i--) {
            double sum = b[i];
            for (int j = i + 1; j < n; j++) sum -= a[i][j]*b[j];
            b[i] = sum / a[i][i];
        }
    }
    
    private void output(double a[][], int anrow) {
        for (int i = 0; i < anrow; i++) {
            System.out.println(" | " + a[i][0] + " " + 
                    a[i][1] + " " + 
                    a[i][2] + " " + 
                    a[i][3] + " | ");
        }
        System.out.println("-----------------------------------------------");
    }
    
    public MatrixInver() {
        System.out.println("Origin matrix:");
        output(a,4);
        lucmp();
        double[] b = new double[anrow];
        double[][] y = new double[anrow][anrow];
        for (int i = 0; i < anrow; i++) { 
            for (int j = 0; j < anrow; j++) b[j] = 0;
            b[i] = 1.0;
            lubksb(b);
            for (int j = 0; j < anrow; j++) y[j][i] = b[j];
        }
        System.out.println("Its inverse matrix:");
        output(y,4);
    }
    
    public static void main(String[] args) {
        new MatrixInver();
    }

}
http://blog.csdn.net/BoyMgl/archive/2007/12/03/1914288.aspx

LU分解的矩阵逆运算相关推荐

  1. 矩阵LU分解分块算法实现

    本文主要描述实现LU分解算法过程中遇到的问题及解决方案,并给出了全部源代码. 1. 什么是LU分解? 矩阵的LU分解源于线性方程组的高斯消元过程.对于一个含有N个变量的N个线性方程组,总可以用高斯消去 ...

  2. matlab将矩阵分解成lu,10行代码实现矩阵的LU分解(matlab)

    最近由于数值分析实验课要求,需要通过matlab实现矩阵的LU分解.但是看了很多网友写的程序,基本上都是通过循环嵌套循环来实现矩阵的LU分解.略感琐碎,因此最近两天便一直在思考能否利用矩阵的乘v法,来 ...

  3. 怎样用matlab做矩阵的LU分解,矩阵LU分解程序实现(Matlab)

    n=4;%确定需要LU分解的矩阵维数 %A=zeros(n,n); L=eye(n,n);P=eye(n,n);U=zeros(n,n);%初始化矩阵 tempU=zeros(1,n);tempP=z ...

  4. 线性代数笔记10——矩阵的LU分解

    在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积).LU分解主要应用在数值分析 ...

  5. 线性代数:矩阵的LU分解

    矩阵的LU分解 基础公式 示例说明 2x2 矩阵情况 3x3 矩阵情况 本节是网易公开课上的麻省理工大学线性代数课程第四节: A的LU分解 的学习笔记. 本篇主要讲解 矩阵的LU分解. 矩阵的LU分解 ...

  6. c# lu分解的代码_矩阵LU分解分块算法实现

    本文主要描述实现LU分解算法过程中遇到的问题及解决方案,并给出了全部源代码. 1. 什么是LU分解? 矩阵的LU分解源于线性方程组的高斯消元过程.对于一个含有N个变量的N个线性方程组,总可以用高斯消去 ...

  7. 用MATLAB实现plu分解,编制计算给定矩阵 A 的 LU 分解和 PLU 分解的通用程序

    用VB编写一个程序,计算出给定的10*10矩阵(存放在二维数组A中)每行元素的最大值和每列元素的最小值 ModuleModule1SubMain()DimA(,)AsInteger={{1,2,3,4 ...

  8. 矩阵分解(1)-- 矩阵分解之LU分解

    目录 1. 分类 2. LU分解 2.1 定义 2.2 存在性和唯一性 2.3 实例 2.4 应用 1. 分类 矩阵分解(decomposition, factorization)是多半将矩阵拆解为数 ...

  9. 矩阵的各种分解: LU分解, QR分解, 特征分解, 对称对角化, 奇异值分解 SVD

    本文主要关注的是有关 "怎样的矩阵能够进行 XX 分解" 的问题,具体分解的实现方式在这里不做归纳. 欢迎访问我的个人主页 zhekaili.github.io,已查看更多的线性代 ...

  10. 矩阵分析——LU分解

    LU分解初步 矩阵的LU分解主要用来求解线性方程组或者计算行列式.在使用初等行变换法求解线性方程组的过程中,系数矩阵的变化情况如下: 由上可知: ,其中U就是上面矩阵A经过行变换后的上三角矩阵,Eij ...

最新文章

  1. 数据中心防雷SPD技术漫谈
  2. 深入浅出classloader
  3. for循环:用turtle画一颗五角星
  4. sql 中 ALTER 和 UPDATE 的区别
  5. 必知必会 | WebView 的一切都在这儿
  6. 大数据_Flink_Java版_数据处理_流处理API_Flink中的UDF函数类---Flink工作笔记0036
  7. 期货市场技术分析01_理论基础
  8. Linux/Unix操作系统目录结构的来历
  9. 这款折纸机器人玩具,可以帮助孩子学习编程和Robot知识
  10. 吴恩达神经网络和深度学习-学习笔记-8-梯度消失与爆炸 + 梯度检测
  11. 关于C++中的继承感悟
  12. 整理学习之注意力机制
  13. 3d打印英语文献_3D打印NiTi形状记忆合金管的扭转性能研究
  14. 如何用PS将一张图片裁剪成圆形?
  15. 【技术分享】Lombok!代码简洁神器还是代码“亚健康”元凶?
  16. 机器学习库Scikit-Learn(线性模型、岭回归、插入一列数据(insert)、提取所需列、向量机(SVM)、聚类)
  17. QT中更改主窗体背景色和背景图片
  18. 以阿里IoT开发物联网和应用平台
  19. 硬币面值组合的算法题解
  20. linux 查看主板sn_Linux系统查看硬件信息

热门文章

  1. Security+ 学习笔记20 身份证明
  2. 使用python的matplotlib模块对netflow的流量信息分析(饼图)
  3. 记一次DNS运维排错
  4. IS-IS详解(十二)——IS-IS 路由过载、管理标记和主机名映射
  5. C++ 从入门到入土(English Version)Section 6: Pointers and Call by Reference
  6. 杭电复试笔记第七天--最终篇
  7. HDOJ--1864--最大报销额
  8. 读取P12格式证书的密钥
  9. 三羊献瑞——第六届蓝桥杯C语言B组(省赛)第三题
  10. MapXtreme 2005 学习心得 关于地图投影坐标问题的解决方式(十四)