矩阵分析之QR分解

矩阵分析之QR分解

1. 定义

QR分解法是目前求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量,在分解过程中利用 GramSchmidt 正交化。它是将矩阵分解成一个正规正交矩阵Q与上三角形矩阵R,所以称为QR分解法。定义如下:

1.1 施密特正交化

矩阵分析之QR分解_第1张图片
矩阵分析之QR分解_第2张图片
矩阵分析之QR分解_第3张图片
算法伪代码描述如下:
矩阵分析之QR分解_第4张图片

1.2 QR分解具体定义

矩阵分析之QR分解_第5张图片

2. 具体问题

说了一大堆理论描述,现在看一个问题如何求解。问题是给定一个矩阵A,其各列线性无关,进行QR分解。

A=0342027111442

2.1 实现过程如下

/*********************************************************
description:A=QR 矩阵A的列线性无关 Matrix A is M-by-N
Author:Robert.Tianyi
Date:2016-10-24
*********************************************************/
#include
#include
#include 
using namespace std;
#define M  3 //A矩阵的行 
#define  N  3 //A矩阵的列 
float Get_Norm(float a[],int size);/*向量求模*/ 
float *VectorDivNum(float a[],float num,int len);/*向量除以一个数*/ 
float * VectorMULNum(float a[],float num,int len);/*向量数乘*/ 
float  VectorMUL(float a[],float b[],int len);/*向量内积*/
float * VectorADD(float a[],float b[],int len); /*向量加法*/ 
float * VectorSUB(float a[],float b[],int len);/*向量减法*/ 
void Matrix_QR_Factorization(float A[M][N]);
int main(){
    float A[M][N]={{0,-20,-14},{3,27,-4},{4,11,-2}};
    cout<<"Matrix A:"<for(int i=0;ifor(int j=0;jcout<8)<" ";
        }
        cout<cout<<"对矩阵A进行QR Factorization";
    Matrix_QR_Factorization(A);
    return 0;
}
void Matrix_QR_Factorization(float A[M][N]){
    int k=0;
    float Q[M][N];
    float R[N][N];
    float temp[M],temp_len;
    float *p=new float[M];
    int i,j;
    for(i=0;ifor(j=0;j0;
    for(k=0;kfor(j=0;j//取出第 j 列  即X_k 
        }
        //先求Q矩阵 
        if(k==0){
            temp_len=Get_Norm(temp,M);
            R[0][0]=temp_len;
            p=VectorDivNum(temp,temp_len,M);
            for(j=0;jif(k>0){
            float *Tempmul=new float[M];
            float *sum=new float[M];
            float tempAj[M];
            float tempQj[M];
            for(i=0;i0;
            }
            for(int tempK=0;tempKfor(i=0;i//从Q矩阵取出第k列 即Q_k
                }
                R[tempK][k]=VectorMUL(temp,tempQj,M);
                Tempmul= VectorMULNum(tempQj,R[tempK][k],M);//计算A_k在Q_j上的投影分量 
                //Tempmul= VectorMULNum(tempQj,VectorMUL(temp,tempQj,M),M);
                sum=VectorADD(Tempmul,sum,M);//计算A_k在所有Q的列向量上的投影分量之和     
                //for(i=0;i
                //  sum[i]+=Tempmul[i];
            }
            float * uk=new float[M];
            int uk_len;
            uk=VectorSUB(temp,sum,M);
            uk_len=Get_Norm(uk,M);
            R[k][k]=uk_len;
            p=VectorDivNum(uk,uk_len,M);    
            for(j=0;jcout<"Matrix Q:"<for(int i=0;ifor(int j=0;jcout<8)<" ";
        }
        cout<cout<"Matrix R:"<for(int i=0;ifor(int j=0;jcout<8)<" ";
        }
        cout</*向量求模*/ 
float Get_Norm(float a[],int size){
    float sum=0;
    for(int i=0;ireturn sqrt(sum);   
}
/*向量除以一个数*/ 
float *VectorDivNum(float a[],float num,int len){
    float *p;
    p=new float[len];
    for(int i=0;ireturn p;
}
/*向量数乘*/ 
float * VectorMULNum(float a[],float num,int len){
    float *p;
    p=new float[len];
    for(int i=0;ireturn p;
}
/*向量内积*/ 
float  VectorMUL(float a[],float b[],int len){
    float *p;
    float result=0;
    for(int i=0;ireturn result;
}
/*向量加法*/ 
float * VectorADD(float a[],float b[],int len){
    float *p;
    p=new float[len];
    for(int i=0;ireturn p;
}
/*向量减法*/ 
float * VectorSUB(float a[],float b[],int len){
    float *p;
    p=new float[len];
    for(int i=0;ireturn p;
    }

程序运行结果如下:
矩阵分析之QR分解_第6张图片

你可能感兴趣的:(算法设计与分析,矩阵分析与应用)