精华内容
下载资源
问答
  • 矩阵分析之LU分解

    千次阅读 2016-10-02 14:40:36
    矩阵分解之LU分解问题:对于n-by-n矩阵A,对A进行分解,使得A=LU,L为下上角矩阵,U为上三角矩阵。实现过程如下:

    矩阵分析之LU分解


    问题:对于n-by-n矩阵A,对A进行分解,使得A=LU,L为下上角矩阵,U为上三角矩阵。实现过程如下:

    /*******************************************************
    程序功能:进行矩阵LU分解
    运行环境:Dev C++5.11
    author:Robert.Tianyi
    日期:2016.10.4 
    ****************************************************/
    #include<stdio.h>
    #include<stdlib.h>
    void Matrix_LU_Factorization(float *B,int n);
    void main(){
        int i,j;
        int n;//  矩阵n-by-n
        printf("请输入n-by-n矩阵A的大小n:\n");
        scanf("%d",&n); 
        float *A;
        A=(float *)malloc(sizeof(float)*n*n);
        printf("请输入%d-by-%d矩阵A,一次性输入%d个元素,元素之间用空格隔开:\n",n,n,n*n);
        for(i=0;i<n*n;i++){
            scanf("%f",&A[i]);
        }
        Matrix_LU_Factorization(A,n);
    }
    void Matrix_LU_Factorization(float *B,int n){
        int i,j,k,p;
        float (*L)[n],(*U)[n],(*test)[n],(*A)[n];
        float temp=0;
        A=(float (*)[n])malloc(sizeof(float)*n*n);
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                A[i][j]=B[i*n+j];
            }
        }
        printf("输入的矩阵A:%d by %d\n",n,n);
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                printf("%8.3f",A[i][j]);
            }
            printf("\n");
        }   
        L=(float (*)[n])malloc(sizeof(float)*n*n);
        U=(float (*)[n])malloc(sizeof(float)*n*n);
        test=(float (*)[n])malloc(sizeof(float)*n*n);
        for(i=0;i<n;i++)
            for(j=0;j<n;j++){
                L[i][j]=0;
                U[i][j]=0;
                if(i==j)
                    L[i][j]=1;
            }
        //进行LU分解 
        for(i=0;i<n;i++){
            if(i==0){
                L[0][0]=1;
                for(j=0;j<n;j++)
                    U[i][j]=A[i][j];
            }
            else{
                for(j=0;j<i;j++){//计算l[i][j] 
                    temp=A[i][j];
                    p=0;
                    while(j>=1&& p<j){      
                        temp=temp-L[i][p]*U[p][j];
                        p++; 
                        }
                        L[i][j]=temp/U[j][j];
                    }
                    for(j=i;j<n;j++){   //计算U[i][j] 
                        temp=A[i][j];
                        p=0;
                        while(p<j){     
                          temp=temp-L[i][p]*U[p][j];
                          p++;  
                        }
                        U[i][j]=temp;       
                    }
                }
        }
        printf("L矩阵:\n");   
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                printf("%10.3f",L[i][j]);
            }
            printf("\n");   
        }
        printf("U矩阵:\n");   
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                printf("%10.3f",U[i][j]);
            }
            printf("\n");   
        }
        printf("还原矩阵A,计算L*U,存放到新矩阵test中,并输出\n");
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                test[i][j]=0;
                for(p=0;p<n;p++){
                    test[i][j]+=L[i][p]*U[p][j];
                }
                printf("%10.3f",test[i][j]);
            }
            printf("\n");
        }       
    }
    

    程序运行结果如下:
    这里写图片描述

    展开全文
  • 线性代数导论 - #4 矩阵分解之LU分解的意义、步骤和成立条件目前我们用于解线性方程组的方法依然是Gauss消元法。...而且,研究发现,Gauss消元法中,n阶矩阵A的消元操作数正比于n3,而右侧向量b...

    线性代数导论 - #4 矩阵分解之LU分解的意义、步骤和成立条件

    目前我们用于解线性方程组的方法依然是Gauss消元法。在Gauss消元法中,我们将右侧向量b与A写在一起作为一个增广矩阵进行同步的操作,这就默认了对A与b的操作数是相等的且每换一个b就要重复一遍对A的操作。

    然而,在实际情况中,右侧向量b经常发生变化。而且,研究发现,Gauss消元法中,对n阶矩阵A的消元操作数正比于n3,而对右侧向量b的回代操作(包括行变换和恢复成代数方程的形式)数仅仅正比于n2。(操作次数上的相对大小可以根据A与b元素数量的差距进行猜想)

    在b不变时,两种算法上的复杂度差距不明显,选择同步操作更为方便直观。但是,当b变化时,如果我们将对A和对b的操作进行分隔的话,只需对A完成一次完整的消元操作,再对b进行回代操作。这样可以大大减少操作的次数。

    所以,在b变化时,我们先对A单独进行分解操作。其中的一种分解方法是LU分解。这种方法的优势在于分解结果中L(上三角矩阵)和U(下三角矩阵)都是三角形矩阵,后续运算比较简便。而且二者恰好相配,使用计算机进行运算时可以存储在一个数组中,节约存储空间。

    利用A的LU分解解线性方程组的过程为将Ax=b等价变形成(LU)x=b,根据结合律有L(Ux)=b,再解Ly=b中的y,最后解Ux=y得到线性方程组的解。

    LU分解的步骤如下:

    1.求U留E:沿用Gauss消元法,将A化为U,不同的是,变换过程中左边乘上的每一个E都要记录下来;

    2.逆E为L:将用到的E各自求逆(取含变换操作的元素的相反数)再逆序相乘(将消元乘数按照原来的位置写到一起,再补齐左上-右下对角线上的1和对角线上方的0),乘积即为L:

    E求逆的简便方法和乘积求逆的运算法则在#3中已经提到。

    逆序相乘等价于归置消元乘数于下三角矩阵中是一个常用结论,记忆使用可以简化运算。

    乘积为L的依据是:假设E为所有E的乘积,EA=U可变形为E-1EA=E-1U=IA=A=LU,其中L=E-1。

    什么样的矩阵才能进行LU分解?

    具体判定方法没有给出。不过根据分解的过程,我们可以推定消元过程中不进行行交换的矩阵才能进行LU分解,即默认主元位(k行k列)上的元素均非0。

    如果必须进行行交换怎么办?

    Prof. Strang引入了置换的概念,针对n阶矩阵,其置换矩阵群含有n!个置换矩阵P也即可能的置换操作。这个矩阵群具有许多特殊的性质,比如P-1=PT,P之间的乘积仍属于该矩阵群。

    置换将在#5中进行详细介绍。

    展开全文
  • 矩阵的一种有效而广泛应用的分解方法是矩阵的LU三角分解,将一个n阶矩阵A分解为一...所以,矩阵求逆的算法流程可表述如下:1)进行LU分解;2)分解后的L阵(下三角矩阵)和U阵(上三角矩阵)进行求逆;3)L阵的逆矩阵和U阵...

    矩阵的一种有效而广泛应用的分解方法是矩阵的LU三角分解,将一个n阶矩阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积。所以首先对矩阵进行三角分解,这里采用Doolittle分解,即分解为一个下三角矩阵(对角元素为1),和一个上三角矩阵的乘积。再进行相应的处理。

    所以,矩阵求逆的算法流程可表述如下:

    1)进行LU分解;

    2)对分解后的L阵(下三角矩阵)和U阵(上三角矩阵)进行求逆;

    3)L阵的逆矩阵和U阵的逆矩阵相乘,即可求得原来矩阵的逆。即:

    程序实现如下:

    #include

    #include

    #define N 4

    void main()

    {

    float a[N][N];

    float L[N][N],U[N][N],out[N][N], out1[N][N];

    float r[N][N],u[N][N];

    memset( a , 0 , sizeof(a)); //初始化

    memset( L , 0 , sizeof(L));

    memset( U , 0 , sizeof(U));

    memset( r , 0 , sizeof(r));

    memset( u , 0 , sizeof(u));

    int n=N;

    int k,i,j;

    int flag=1;

    float s,t;

    input a matrix

    printf("input A=\n");

    for(i=0;i

    for(j=0;j

    scanf("%f",&a[i][j]);

    //figure the input matrix//

    printf("输入矩阵:\n");

    for(i=0;i

    {

    for (j = 0; j < n; j++)

    {

    printf("%lf ", a[i][j]);

    }

    printf("\n");

    }

    for(j=0;j

    a[0][j]=a[0][j]; //计算U矩阵的第一行

    for(i=1;i

    a[i][0]=a[i][0]/a[0][0]; //计算L矩阵的第1列

    for(k=1;k

    {

    for(j=k;j

    {

    s=0;

    for (i=0;i

    s=s+a[k][i]*a[i][j]; //累加

    a[k][j]=a[k][j]-s; //计算U矩阵的其他元素

    }

    for(i=k+1;i

    {

    t=0;

    for(j=0;j

    t=t+a[i][j]*a[j][k]; //累加

    a[i][k]=(a[i][k]-t)/a[k][k]; //计算L矩阵的其他元素

    }

    }

    for(i=0;i

    for(j=0;j

    {

    if(i>j)

    {

    L[i][j]=a[i][j];

    U[i][j]=0;

    }//如果i>j,说明行大于列,计算矩阵的下三角部分,得出L的值,U的//为0

    else

    {

    U[i][j]=a[i][j];

    if(i==j)

    L[i][j]=1; //否则如果i

    else

    L[i][j]=0;

    }

    }

    if(U[1][1]*U[2][2]*U[3][3]*U[4][4]==0)

    {

    flag=0;

    printf("\n逆矩阵不存在");}

    if(flag==1)

    {

    /求L和U矩阵的逆

    for (i=0;i

    {

    u[i][i]=1/U[i][i];//对角元素的值,直接取倒数

    for (k=i-1;k>=0;k--)

    {

    s=0;

    for (j=k+1;j<=i;j++)

    s=s+U[k][j]*u[j][i];

    u[k][i]=-s/U[k][k];//迭代计算,按列倒序依次得到每一个值,

    }

    }

    for (i=0;i

    {

    r[i][i]=1; //对角元素的值,直接取倒数,这里为1

    for (k=i+1;k

    {

    for (j=i;j<=k-1;j++)

    r[k][i]=r[k][i]-L[k][j]*r[j][i]; //迭代计算,按列顺序依次得到每一个值

    }

    }

    /绘制矩阵LU分解后的L和U矩阵///

    printf("\nLU分解后L矩阵:");

    for(i=0;i

    {

    printf("\n");

    for(j=0;j

    printf(" %lf",L[i][j]);

    }

    printf("\nLU分解后U矩阵:");

    for(i=0;i

    {

    printf("\n");

    for(j=0;j

    printf(" %lf",U[i][j]);

    }

    printf("\n");

    绘制L和U矩阵的逆矩阵

    printf("\nL矩阵的逆矩阵:");

    for(i=0;i

    {

    printf("\n");

    for(j=0;j

    printf(" %lf",r[i][j]);

    }

    printf("\nU矩阵的逆矩阵:");

    for(i=0;i

    {

    printf("\n");

    for(j=0;j

    printf(" %lf",u[i][j]);

    }

    printf("\n");

    //验证将L和U相乘,得到原矩阵

    printf("\nL矩阵和U矩阵乘积\n");

    for(i=0;i

    {

    for(j=0;j

    {

    out[i][j]=0;

    }

    }

    for(i=0;i

    {

    for(j=0;j

    {

    for(k=0;k

    {

    out[i][j]+=L[i][k]*U[k][j];

    }

    }

    }

    for(i=0;i

    {

    for(j=0;j

    {

    printf("%lf\t",out[i][j]);

    }

    printf("\r\n");

    }

    //将r和u相乘,得到逆矩阵

    printf("\n原矩阵的逆矩阵:\n");

    for(i=0;i

    {

    for(j=0;j

    {out1[i][j]=0;}

    }

    for(i=0;i

    {

    for(j=0;j

    {

    for(k=0;k

    {

    out1[i][j]+=u[i][k]*r[k][j];

    }

    }

    }

    for(i=0;i

    {

    for(j=0;j

    {

    printf("%lf\t",out1[i][j]);

    }

    printf("\r\n");

    }

    }

    }

    展开全文
  • 线性代数导论 - #4 矩阵分解之LU分解的意义、步骤和成立条件 目前我们用于解线性方程组的方法依然是Gauss消元法。在Gauss消元法中,我们将...而且,研究发现,Gauss消元法中,n阶矩阵A的消元操作数正比于n3,...

    线性代数导论 - #4 矩阵分解之LU分解的意义、步骤和成立条件

     

    目前我们用于解线性方程组的方法依然是Gauss消元法。在Gauss消元法中,我们将右侧向量b与A写在一起作为一个增广矩阵进行同步的操作,这就默认了对A与b的操作数是相等的且每换一个b就要重复一遍对A的操作。

    然而,在实际情况中,右侧向量b经常发生变化。而且,研究发现,Gauss消元法中,对n阶矩阵A的消元操作数正比于n3,而对右侧向量b的回代操作(包括行变换和恢复成代数方程的形式)数仅仅正比于n2。(操作次数上的相对大小可以根据A与b元素数量的差距进行猜想)

    在b不变时,两种算法上的复杂度差距不明显,选择同步操作更为方便直观。但是,当b变化时,如果我们将对A和对b的操作进行分隔的话,只需对A完成一次完整的消元操作,再对b进行回代操作。这样可以大大减少操作的次数。

    所以,在b变化时,我们先对A单独进行分解操作。其中的一种分解方法是LU分解。这种方法的优势在于分解结果中L(上三角矩阵)和U(下三角矩阵)都是三角形矩阵,后续运算比较简便。而且二者恰好相配,使用计算机进行运算时可以存储在一个数组中,节约存储空间。 

    利用A的LU分解解线性方程组的过程为将Ax=b等价变形成(LU)x=b,根据结合律有L(Ux)=b,再解Ly=b中的y,最后解Ux=y得到线性方程组的解。

     

    LU分解的步骤如下:

    1.求U留E:沿用Gauss消元法,将A化为U,不同的是,变换过程中左边乘上的每一个E都要记录下来;

    2.逆E为L:将用到的E各自求逆(取含变换操作的元素的相反数)再逆序相乘(将消元乘数按照原来的位置写到一起,再补齐左上-右下对角线上的1和对角线上方的0),乘积即为L:

    E求逆的简便方法和乘积求逆的运算法则在#3中已经提到。

    逆序相乘等价于归置消元乘数于下三角矩阵中是一个常用结论,记忆使用可以简化运算。

    乘积为L的依据是:假设E为所有E的乘积,EA=U可变形为E-1EA=E-1U=IA=A=LU,其中L=E-1

     

    什么样的矩阵才能进行LU分解?

    具体判定方法没有给出。不过根据分解的过程,我们可以推定消元过程中不进行行交换的矩阵才能进行LU分解,即默认主元位(k行k列)上的元素均非0。

     

    如果必须进行行交换怎么办?

    Prof. Strang引入了置换的概念,针对n阶矩阵,其置换矩阵群含有n!个置换矩阵P也即可能的置换操作。这个矩阵群具有许多特殊的性质,比如P-1=PT,P之间的乘积仍属于该矩阵群。

    置换将在#5中进行详细介绍。

    转载于:https://www.cnblogs.com/samaritan-z/p/8353323.html

    展开全文
  • 矩阵的因式分解是把一个矩阵A表示为两个或更多个矩阵的乘积,是将复杂的数据进行分解,其中有多种方法,例如:LU分解,秩分解,QR分解,奇异值分解,谱分解等。这里主要介绍对LU分解的认识。 根据参考的书籍,这里的...
  • 矩阵LU分解算法分析

    万次阅读 2014-01-23 19:39:47
    什么是矩阵LU的分解呢?顾名思义LU分解就是讲矩阵分解成下三角矩阵L和上三角矩阵U。可能一上来直接就讲解矩阵LU分解有点突然。那么在说这个之前呢我们先从线性代数方面回顾一下吧,其实...1)n阶矩阵A进行转置 start
  • 矩阵LU分解求逆(学习笔记)

    万次阅读 2014-09-25 16:51:10
    矩阵的一种有效而广泛应用的分解方法是矩阵的LU三角分解,将一个n阶矩阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积。所以首先对矩阵进行三角分解,这里采用Doolittle分解,即分解为一个下三角矩阵(对角元素为1...
  • LU分解

    千次阅读 2015-10-27 16:51:09
    A是一个方块矩阵A的LU分解是将它分解成如下形式:其中L和U分别是下三角矩阵和上三角矩阵。...一个充分消元的LU分解为如下形式: 将以下矩阵进行LU分解:由于矩阵阶数只是2,可以直接列方程解:
  • LU分解版本1

    2013-10-15 22:44:32
    系数矩阵A进行LU分解,没有采用原地存储方式,没有进行选主元 function ex2_7_1 %系数矩阵A进行LU分解【自己写的版本,没有采用原地存储方式,没有进行选主元】 %将L矩阵和U矩阵输出, A = [10 -7 0; -3 2 6...
  • %系数矩阵A进行LU分解 %【自己写的版本,采用原地存储方式,进行选主元】 %将L矩阵和U矩阵输出, A = [10 -7 0; -3 2 6; 5 -1 5]; %系数矩阵A进行LU分解,最终得到L 和 U矩阵 %初始化L和U矩阵. L = [0 0 ...
  • MIT_线性代数笔记_04_ALU分解

    千次阅读 2017-03-19 18:37:09
    MIT 公开课:Gilbert Strang《线性代数》课程笔记(汇总)Lecture 4: Factorization into A = LU ...对矩阵 AA 进行 Gauss 消元相当于用一系列初等矩阵左乘 AA 从而得到上三角矩阵 U.U.以 3×33 \times 3 矩
  • 线性代数之——ALU 分解

    千次阅读 2018-11-15 13:15:42
    1. A = LU 之前在消元的过程中,我们看到可以将矩阵 AAA 变成一个上三角矩阵 UUU,UUU 的角线上就是主元。下面我们将这个过程反过来,通一个下三角矩阵 LLL 我们可以从 UUU 得到 AAA, LLL 中的元素也就是乘数 ...
  • VAR模型的方差分解中,很重要的一步是使用cholesky分解误差项的协方差矩阵进行变形,cholesky分解的本质是将对称的正定矩阵进行特殊的LU分解,化为如下的形式: 其中L表示下三角矩阵,等于chlesky分解将A变化为...
  • %系数矩阵A进行LU分解【自己写的版本,没有采用原地存储方式,进行选主元】 %将L矩阵和U矩阵输出, A = [10 -7 0; -3 2 6; 5 -1 5]; %系数矩阵A进行LU分解,最终得到L 和 U矩阵 %初始化L和U矩阵. L = [0 ...
  • 其中LU分解和QR分解都是使用角线上方或者下方的元素均为0的三角矩阵进行计算。使用三角矩阵表示的线性方程组,可以通过向前或者向后置换很容易地得出结果。4.1.1 行列式、逆和秩在MATLAB中,用户可以通过以下...
  • 调用函数: [L,U,P]=lu(A,‘vector’) 表示对矩阵A进行LU分解,其中L是下三角矩阵,U是上三角矩阵,P是置换阵。 满足关系式:LU=PA 不过这里的置换阵使用向量表示: ...
  • 10矩阵的三角分解

    2019-12-15 09:56:52
    矩阵的三角分解1Gauss消元法的...对矩阵AAA每一列进行单独处理,左乘矩阵,使其变为上三角矩阵的样子。 2LU分解 A=A(0)=L1L2...Ln−1A(n−1)A=A^{(0)}=L_1L_2...L_{n-1}A^{(n-1)}A=A(0)=L1​L2​...Ln−1​A(n−1),...
  • Matlab矩阵分解

    千次阅读 2018-11-26 16:16:53
    Matlab矩阵的分解 一、LU分解:将方阵分解为一个上三角矩阵和一个下三角矩阵的乘积,即A=LU,其中A...例如:对矩阵A=[1 2 -1;3 4 -2;5 -4 1]进行LU 分解 &gt;&gt; a=[1,2,-1;3,4,-2;5,-4,1]; &gt;&g...
  • 矩阵分析与应用》小作业1 实现部分主元法下的LU分解 by苗栋 程序大体介绍: 引入了numpy便于对数组的操作 ①寻找出一列中绝对值最大的元素作为主元并进行数组的行交换,并将L主角线元素置为1 ②构造两个for循环...
  • PLU-分解以及求逆矩阵

    2021-02-03 11:17:40
    PLU-分解是对LU分解的一种改进,其增加了选主元的操作增加了计算的稳定性,及在第i次循环中将 j=where(max⁡(∣A[i:n,i]∣))j=where(\max(|A[i:n,i]|))j=where(max(∣A[i:n,i]∣)) 行和第i行进行交换来比避免角...
  • 矩阵求逆算法这里采用的是LU分解对矩阵进行求逆。原理如下: inv(A)=inv(LU)= inv(U)inv(L) 将原矩阵A分解成两个三角矩阵,上三角矩阵L和下三角矩阵U。通过求解U和L对应的逆矩阵,即可求得相应A的逆矩阵。算法分成...
  • 奇异值分解

    2019-05-26 16:19:40
    singular value decomposition)是对矩阵最好的分解形式(前面介绍过矩阵的LU分解,对角化分解),它将某个矩阵A分解为正交矩阵(orthogonal matrix),对角矩阵(diagonal matrix)和正交矩阵相乘的形式,A可以是...
  • 其中LU分解和QR分解都是使用角线上方或者下方的元素均为0的三角矩阵进行计算。使用三角矩阵表示的线性方程组,可以通过向前或者向后置换很容易地得出结果。4.1.1 行列式、逆和秩在MATLAB中,用户可以通过以下...
  • 矩阵代数_part1

    千次阅读 2012-08-13 19:55:09
    本章给出了2个重要的概念 ...为了进一步简化计算,系数矩阵进行LU分解的方法。   【Section】矩阵运算 【定义】若A是mXn矩阵,B是nXp矩阵,B的列是b1,…,bp,则乘积AB是nXp矩阵,它的各列是Ab1,…,Abp,即
  • singular value decomposition)是对矩阵最好的分解形式(前面介绍过矩阵的LU分解,对角化分解),它将某个矩阵A分解为正交矩阵(orthogonal matrix),对角矩阵(diagonal matrix)和正交矩阵相乘的形式,A可以是...
  • LR分解

    千次阅读 2018-04-13 10:09:19
    给定方阵矩阵A,通过LR分解将A分解成下三角矩阵L和上三角矩阵U的乘机,成为LR分解,也称LU分解。而我们希望得到角线是1,如下图所示。而在非方阵A中,我们希望得到如下图。 一旦完成了LR分解,利用L和U的性质...
  • 先说一下原理: 对于一个可逆矩阵A,必然会得到它的唯一LU分解,即分解为一个下三角矩阵L和一个上三角矩阵U使得 A=L*U; 我们需要求得的问题是A的逆矩阵A`,已知 A=LU,A*A`=E,所以 A` = U`*L`; ...

空空如也

空空如也

1 2 3
收藏数 45
精华内容 18
关键字:

对矩阵a进行lu分解