资源描述:
《矩阵四种分解:PALU,QR,Household,Givens的c程序.pdf》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、#include"stdio.h"#include"malloc.h"#include"math.h"voidScanMatrix(float*arr,intm,intn);//输入矩阵voidmatrixmul(float*arr1,float*arr2,float*arr3,intm,intn,intk);//矩阵数乘函数voidprintm(charc,float*arr,intm,intn);//矩阵打印函数voidPALU(float*arr,intm,intn);//PA=LU分解函数voidGram_Schmint(float*arr
2、,intm,intn);//QR分解函数voidHousehold(float*arr,intm,intn);//household分解函数voidGivens(float*arr,intm,intn);//givens分解函数voiddivide();//分解矩阵总函数intmain(){divide();return0;}voiddivide(){intm,n,method,flag=1;charc='0';while(c!='#'){printf("请输入mXn矩阵维度m:");scanf("%d",&m);printf("请输入mXn矩阵维
3、度n:");scanf("%d",&n);float*arr=(float*)malloc(sizeof(float)*m*n);ScanMatrix(arr,m,n);while(flag){printf("请输入矩阵的分解方式:1-PA=LU,2-Gram-Schmit正交化A=QR,3-Household分解A=QU,4-Givens分解A=QU。5-结束分解.");scanf("%d",&method);switch(method){case1:PALU(arr,m,n);break;case2:Gram_Schmi
4、nt(arr,m,n);break;case3:Household(arr,m,n);break;case4:Givens(arr,m,n);break;case5:flag=0;break;}}flag=1;printf("输入#结束,否则继续重新输入矩阵开始分解:");getchar();c=getchar();free(arr);}}voidPALU(float*arr,intm,intn){inti,j,k,p,q,exsit=1,change1=0,change2=0;floatt,s;float*arrt=(float*)malloc(
5、sizeof(float)*m*n);float*P=(float*)malloc(sizeof(float)*m*m);float*L=(float*)malloc(sizeof(float)*m*m);for(i=0;i6、i0&&j7、j行逐个进行值交换;*(P+j*m+k)=*(P+i*m+k);*(P+i*m+k)=t;}break;}if(j==n){exsit=0;printf("矩阵不满秩,不可分解!");//不存在非零主元;break;}}}for(p=i+1;p8、s)*(*(arrt+i*n+q))/(*(arrt+i*n+i));//消元过程}}for(k=0;k