矩阵分析之Givens Reduction
矩阵分析之Givens Reduction
1.Givens Rotation介绍
2.Givens Reduction算法原理
(1).获取待约减的矩阵AA: (m−by−n)(m-by-n)
\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=\frac{A_k[k][k]}{sqrt({A_k[k][k]}^2)+{A_k[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=\overline P*P
(3).e,更新矩阵 AkA_k,
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相关推荐
- 矩阵分析之Householder Reduction
矩阵分析之Householder Reduction 我们都知道通过高斯消元法.初等行变换可以得到一个矩阵的行阶梯表达.但这不是唯一的方法.Householder reduction就可以完成这项任务 ...
- 李保滨矩阵分析大作业2022:LU、QR、URV分解、Householder、Givens变换的程序实现
介绍 本文为2022年秋季学期国科大李保滨老师的矩阵分析与应用课程大作业实现,编程语言使用python 具体作业要求: 完成课堂上讲的关于矩阵分解的LU.QR(Gram-Schmidt).正交规约(H ...
- 应用矩阵分析1 子空间分析1 线性子空间基础
应用矩阵分析1 子空间分析1 线性子空间基础 基本理论 正交分解 子空间的正交投影 应用举例 离散信号的Casorati矩阵 正交多分辨率分析 Orthogonal Procrustes Proble ...
- 第十章:MATLAB:矩阵分析(特征值与特征向量,矩阵对角化,若尔当标准型,矩阵的反射与旋转变换)
第十章:矩阵分析 10.1. 特征值与特征向量 10.1.1. 标准特征值与特征向量问题 实例--矩阵特征值与特征向量 实例:矩阵特征值 10.1.2. 广义特征值与特征向量问题 实例:广义特征值与广 ...
- 矩阵分析与应用(17)
学习来源:<矩阵分析与应用> 张贤达 清华大学出版社 QR 分解及其应用 1. Givens 旋转 Givens 旋转就是初等旋转变换.在 维向量空间中,通过固定 维不变,在剩下的两维 ...
- TVM Reduction降低算力
TVM Reduction降低算力 这是有关如何降低算力TVM的介绍材料.像sum / max / min这样的关联约简运算符是线性代数运算的典型构造块. 本文将演示如何降低TVM算力. from f ...
- 使用LDA(Linear Discriminant Analysis)进行降维(dimention reduction)详解和实战
使用LDA(Linear Discriminant Analysis)进行降维(dimention reduction)详解和实战 LDA也可被视为一种监督降维技术.不同于PCA(Principle ...
- HDLBits 系列(6)(Reduction)缩位运算符
目录 抛砖引玉 Reduction在奇偶校验中的应用 抛砖引玉 您已经熟悉两个值之间的按位运算,例如a&b或a ^ b. 有时,如果向量很长,您想创建一个对一个向量的所有位进行操作的宽门,例如 ...
- Kattis之旅——Prime Reduction
A prime number p≥2 is an integer which is evenly divisible by only two integers: 1 and p. A composit ...
最新文章
- 2块钱就能买上千张人脸照片?央视曝光AI黑产,产业链太惊人了
- NEO改进协议提案2(NEP-2)
- opencv 转换图像为灰度
- QML基础类型之vector4d
- cf1561D Up the Strip(D1D2)
- 默认HotSpot最大直接内存大小
- JS之BOM和DOM(来源、方法、内容、应用)
- (5)vivado不能生成bit文件(学无止境)
- 【重难点】【分布式 01】RESTful、RPC 对比、Dubbo、Spring Cloud 对比、Eureka、Zookeeper、Consul、Nacos 对比、分布式锁
- 开发人员需要了解的渐进式Web应用程序
- Git(5)-- 获取 Git 仓库(git init 和 git clone命令)
- Java的GUI学习八(键盘码查询器)
- 【软件应用开发】小米便签APP维护开发
- liunx机器开放8080端口
- iPad谷歌浏览器怎么开摄像头_谷歌浏览器网页截图的步骤_谷歌浏览器怎么截图...
- Python网络爬虫入门篇
- win7计算机不支持此接口,Win7 "explorer.exe 不支持此接口"问题
- setdbprefs matlab,matlab数据导入与导出
- 新建SpringCloud电商后台项目
- cannot reach adb server, attempting to reconnect.
热门文章
- 阅读收获——IT产业的六个规律
- 声卡突然听不到监听_初次玩外置声卡监听与录音 遇到些问题 恳请大神帮忙解决...
- 成功解决:ERROR: Cannot find command ‘git‘ - do you have ‘git‘ installed and in your PATH?
- 2023版毛概+习概(习思想)课后题及答案整理
- lightgb原理_污染治理设施监管平台原理,智慧安全用电订制
- Ubuntu/Linux下自动获取最佳GPU编号的脚本
- 华南工学院的电子计算机系历史,华南理工大学有哪些专业和学院及院系排名
- MySQL5.7绿色版卸载及安装配置
- 设计模式之略见一斑(解释器模式Interpreter)
- cmds系统归并缓慢的处理过程 2017-2-16