矩阵分析之Givens Reduction

1.Givens Rotation介绍



2.Givens Reduction算法原理

(1).获取待约减的矩阵AA: (m−by−n)(m-by-n)

⎡⎣⎢⎢⎢a11a21⋯am1a12a22⋯am2a13a23⋯am3⋯⋯⋯⋯a1na2n⋯amn⎤⎦⎥⎥⎥

\left [\begin{array}{}a_{11}& a_{12}& a_{13}&\cdots &a_{1n}\\a_{21}& a_{22}& a_{23}&\cdots &a_{2n}\\\cdots & \cdots &\cdots &\cdots &\cdots \\a_{m1}& a_{m2}& a_{m3}&\cdots&a_{mn}\\\end{array} \right]
(2)初始化矩阵P为单位矩阵
(3) k=1:n k=1 :n 循环下面操作:
利用旋转矩阵是的矩阵 AA中的第kk列的 kk个元素下面的所有元素为0.则j=k+1j=k+1取到 mm
(3).a计算矩阵Pk=P∗AP_k=P*A;
(3).b计算 c和sc和s

c=Ak[k][k]sqrt(Ak[k][k]2)+Ak[j][k]2

c=\frac{A_k[k][k]}{sqrt({A_k[k][k]}^2)+{A_k[j][k]}^2}

s=Ak[j][k]sqrt(Ak[k][k]2)+Ak[j][k]2

s=\frac{A_k[j][k]}{sqrt({A_k[k][k]}^2)+{A_k[j][k]}^2}
(3).c 令 P¯¯¯=I\overline P=I;然后用 cc去替代矩阵P¯¯¯\overline P中的 第 kk行第 kk列的元素;然后用 ss去替代矩阵P¯¯¯\overline P中的 第 kk行第 jj列的元素;然后用 −s-s去替代矩阵 P¯¯¯\overline P中的 第 jj行第 jj列的元素;然后用 cc去替代矩阵P¯¯¯\overline P中的 第 jj行第 jj列的元素;
(3).d,更新矩阵 PP,

P=P¯¯¯∗P

P=\overline P*P
(3).e,更新矩阵 AkA_k,

Ak=P∗A

A_k=P*A
(4).循环结束则可得到矩阵 PP和T=P∗AT=P*A

3.具体实例

给定矩阵A<script type="math/tex" id="MathJax-Element-3101">A</script>,求其Givens Reduction?
实现过程如下:

/*****************************************************
Description:Matrix_GivensReduction
Author:Robert.Tianyi
Date:2016.11.3
******************************************************/
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdlib>
using namespace std;
float * MatrixMulMatrix(float *Pone,float *Rone,int m,int n);
float  VectorMUL(float a[],float b[],int len);
void Matrix_GivensReduction(float *B,int m,int n);
int main(){float A[3][3]={{0,-20,-14},{3,27,-4},{4,11,-2}};float B[9];cout<<"原始矩阵A:"<<endl;for(int i=0;i<3;i++){for(int j=0;j<3;j++){cout<<setw(6)<<A[i][j]<<" ";B[i*3+j]=A[i][j];}cout<<endl;}Matrix_GivensReduction(B,3,3);
}
void Matrix_GivensReduction(float *B,int m,int n){cout<<"进行Matrix_GivensReduction:"<<endl; float A[m][n];for(int i=0;i<m;i++)for(int j=0;j<n;j++)A[i][j]=B[i*n+j];cout<<"矩阵A:"<<endl;for(int i=0;i<m;i++){for(int j=0;j<n;j++){cout<<setw(6)<<A[i][j]<<" ";    }cout<<endl;}float P[m][m];for(int i=0;i<m;i++){for(int j=0;j<m;j++){P[i][j]=0;if(i==j)P[i][j]=1;}}float Ak[m][n];for(int k=0;k<n;k++){for(int j=k+1;j<m;j++){//让第K列的第K个元素后面的元素进行Givens rotation //计算矩阵P*A 等于zAk矩阵 float *Pone=new float[m*m]; float *Aone=new float[m*n];int t=0;for(int i=0;i<m;i++){for(int j=0;j<m;j++){Pone[t++]=P[i][j];}}t=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){Aone[t++]=A[i][j];}}float *PmulA=new float [m*n];t=0;PmulA=MatrixMulMatrix(Pone,Aone,m,n);for(int i=0;i<m;i++){for(int j=0;j<n;j++){Ak[i][j]=PmulA[t++];}} float c,s;c= Ak[k][k]/sqrt((Ak[k][k])*(Ak[k][k])+(Ak[j][k])*(Ak[j][k]));s= Ak[j][k]/sqrt((Ak[k][k])*(Ak[k][k])+(Ak[j][k])*(Ak[j][k]));float temp_P[m][m];for(int i=0;i<m;i++){for(int j=0;j<m;j++){temp_P[i][j]=0;if(i==j)temp_P[i][j]=1;}}temp_P[k][k]=c;temp_P[k][j]=s;temp_P[j][k]=-s;temp_P[j][j]=c;float *temp_Pone=new float[m*m]; t=0;for(int i=0;i<m;i++){for(int j=0;j<m;j++){temp_Pone[t++]=temp_P[i][j];}}//计算矩阵temp_P乘以P float *temp_PmulP=new float [m*m];temp_PmulP=MatrixMulMatrix(temp_Pone,Pone,m,m);//更新矩阵Pfor(int i=0;i<m;i++){for(int j=0;j<m;j++){P[i][j]=temp_PmulP[i*m+j];}} }   }cout<<"矩阵P:\n"<<endl;for(int i=0;i<m;i++){for(int j=0;j<m;j++){cout<<setw(8)<<P[i][j];}cout<<endl;} //最后更新矩阵Ak=P*A; float *Pone=new float[m*m]; float *Aone=new float[m*n];int t=0;for(int i=0;i<m;i++){for(int j=0;j<m;j++){Pone[t++]=P[i][j];}}t=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){Aone[t++]=A[i][j];}}float *PmulA=new float [m*n];t=0;PmulA=MatrixMulMatrix(Pone,Aone,m,n);for(int i=0;i<m;i++){for(int j=0;j<n;j++){Ak[i][j]=PmulA[t++];if(Ak[i][j]>-0.00001&&Ak[i][j]<0.00001)Ak[i][j]=0;}} cout<<"矩阵T=P*A:\n"<<endl;for(int i=0;i<m;i++){for(int j=0;j<n;j++){cout<<setw(5)<<Ak[i][j];}cout<<endl;}
}
float * MatrixMulMatrix(float *Pone,float *Aone,int m,int n){float *PmulA=new float [m*n];float result[m][n];float (*P)[m];P=(float (*)[m])malloc(sizeof(float)*(m)*(m));float (*A)[n];A=(float (*)[n])malloc(sizeof(float)*(m)*(n));int k=0;for(int i=0;i<m;i++){for(int j=0;j<m;j++){P[i][j]=Pone[k++];}}k=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){A[i][j]=Aone[k++];}}for(int i=0;i<m;i++){//读取P的第i行 float *Pvector=new float[m];for(int k=0;k<m;k++){Pvector[k]=P[i][k]; }for(int j=0;j<n;j++){//读取A第J列 float *Avector=new float[m];for(int k=0;k<m;k++){Avector[k]=A[k][j]; }result[i][j]=VectorMUL(Pvector,Avector,m);PmulA[i*m+j]=result[i][j];}   }return PmulA;
}
/*向量内积*/
float  VectorMUL(float a[],float b[],int len){float *p;float result=0;for(int i=0;i<len;i++)result+=a[i]*b[i];return result;
}

运行结果如下:

矩阵分析之Givens Reduction相关推荐

  1. 矩阵分析之Householder Reduction

    矩阵分析之Householder Reduction 我们都知道通过高斯消元法.初等行变换可以得到一个矩阵的行阶梯表达.但这不是唯一的方法.Householder reduction就可以完成这项任务 ...

  2. 李保滨矩阵分析大作业2022:LU、QR、URV分解、Householder、Givens变换的程序实现

    介绍 本文为2022年秋季学期国科大李保滨老师的矩阵分析与应用课程大作业实现,编程语言使用python 具体作业要求: 完成课堂上讲的关于矩阵分解的LU.QR(Gram-Schmidt).正交规约(H ...

  3. 应用矩阵分析1 子空间分析1 线性子空间基础

    应用矩阵分析1 子空间分析1 线性子空间基础 基本理论 正交分解 子空间的正交投影 应用举例 离散信号的Casorati矩阵 正交多分辨率分析 Orthogonal Procrustes Proble ...

  4. 第十章:MATLAB:矩阵分析(特征值与特征向量,矩阵对角化,若尔当标准型,矩阵的反射与旋转变换)

    第十章:矩阵分析 10.1. 特征值与特征向量 10.1.1. 标准特征值与特征向量问题 实例--矩阵特征值与特征向量 实例:矩阵特征值 10.1.2. 广义特征值与特征向量问题 实例:广义特征值与广 ...

  5. 矩阵分析与应用(17)

    学习来源:<矩阵分析与应用> 张贤达 清华大学出版社 QR 分解及其应用 1. Givens 旋转 Givens 旋转就是初等旋转变换.在  维向量空间中,通过固定  维不变,在剩下的两维 ...

  6. TVM Reduction降低算力

    TVM Reduction降低算力 这是有关如何降低算力TVM的介绍材料.像sum / max / min这样的关联约简运算符是线性代数运算的典型构造块. 本文将演示如何降低TVM算力. from f ...

  7. 使用LDA(Linear Discriminant Analysis)进行降维(dimention reduction)详解和实战

    使用LDA(Linear Discriminant Analysis)进行降维(dimention reduction)详解和实战 LDA也可被视为一种监督降维技术.不同于PCA(Principle ...

  8. HDLBits 系列(6)(Reduction)缩位运算符

    目录 抛砖引玉 Reduction在奇偶校验中的应用 抛砖引玉 您已经熟悉两个值之间的按位运算,例如a&b或a ^ b. 有时,如果向量很长,您想创建一个对一个向量的所有位进行操作的宽门,例如 ...

  9. Kattis之旅——Prime Reduction

    A prime number p≥2 is an integer which is evenly divisible by only two integers: 1 and p. A composit ...

最新文章

  1. 2块钱就能买上千张人脸照片?央视曝光AI黑产,产业链太惊人了
  2. NEO改进协议提案2(NEP-2)
  3. opencv 转换图像为灰度
  4. QML基础类型之vector4d
  5. cf1561D Up the Strip(D1D2)
  6. 默认HotSpot最大直接内存大小
  7. JS之BOM和DOM(来源、方法、内容、应用)
  8. (5)vivado不能生成bit文件(学无止境)
  9. 【重难点】【分布式 01】RESTful、RPC 对比、Dubbo、Spring Cloud 对比、Eureka、Zookeeper、Consul、Nacos 对比、分布式锁
  10. 开发人员需要了解的渐进式Web应用程序
  11. Git(5)-- 获取 Git 仓库(git init 和 git clone命令)
  12. Java的GUI学习八(键盘码查询器)
  13. 【软件应用开发】小米便签APP维护开发
  14. liunx机器开放8080端口
  15. iPad谷歌浏览器怎么开摄像头_谷歌浏览器网页截图的步骤_谷歌浏览器怎么截图...
  16. Python网络爬虫入门篇
  17. win7计算机不支持此接口,Win7 "explorer.exe 不支持此接口"问题
  18. setdbprefs matlab,matlab数据导入与导出
  19. 新建SpringCloud电商后台项目
  20. cannot reach adb server, attempting to reconnect.

热门文章

  1. 阅读收获——IT产业的六个规律
  2. 声卡突然听不到监听_初次玩外置声卡监听与录音 遇到些问题 恳请大神帮忙解决...
  3. 成功解决:ERROR: Cannot find command ‘git‘ - do you have ‘git‘ installed and in your PATH?
  4. 2023版毛概+习概(习思想)课后题及答案整理
  5. lightgb原理_污染治理设施监管平台原理,智慧安全用电订制
  6. Ubuntu/Linux下自动获取最佳GPU编号的脚本
  7. 华南工学院的电子计算机系历史,华南理工大学有哪些专业和学院及院系排名
  8. MySQL5.7绿色版卸载及安装配置
  9. 设计模式之略见一斑(解释器模式Interpreter)
  10. cmds系统归并缓慢的处理过程 2017-2-16