C语言实现矩阵的LU分解、施密特正交化、Givens分解、Householder分解

合集下载

第六节 HOUSEHOLDER变换与矩阵的正交分解

第六节 HOUSEHOLDER变换与矩阵的正交分解

(2 5)
(4 2 5)
I (1)
H2
0
1 0
0 H (2)
2
0 0
H (2) 2
0
1 0 0
0 42 5
52 5 2 5
52 5
0
2
5
52 5
42
5
5 2 5
H2 x ( x1 , 2 , 0)T (2, 5, 0)T
数值分析
数值分析Biblioteka 3. Hk阵对n阶方阵A作变换得到的结果 (a)Hk左乘A,只改变A的自k行以下各元素,不改变A的前k 1行;
对x(2)
( xk , xk1,L
, xn )T
Rn
k
1
,
构造初等反射阵H
(2 k
)
H (2) k
I (2)
1
U ( k ) (U ( k ) )T R( nk 1)( nk 1)
k
U (k ) ( k xk , xk 1 ,L , xn )T Rnk 1
u(k ) 1
k
xk
n
1
k sign( xk )( xi2 )2
即:任给定x ( x1 , x2 ,L , xn )T 0, 构造Hk Rnn , 使
Hk x ( x1, x2 ,L , xk1, k , 0,L , 0)T
推导:x ( x1 , x2 ,L , xn )T 0
y ( x1 ,L , xk1 , k , 0,L , 0)T
n
1
k sign( xk )( xi2 )2 ,
用降维法
2
sign( x2 )( x22
1
x32 ) 2
5
对x(2) =(2,1)T U (2) ( 2 x2 , x3 ) (2 5 ,1)T

数值分析7.2矩阵的正交分解与求矩阵全部特征值的QR方法

数值分析7.2矩阵的正交分解与求矩阵全部特征值的QR方法

但 x y ,则存在householder阵
2
2
UU T
H I2 U 2
2
使Hx y,其中U x y。 W
x
x y
y
证:若设W U ,则有 W 1,因此
U
2
I
H 2
2
I 2WW T
(x y) x y 2
( xT
yT
I )
UU T 2 U2
2
Hx
x
2
( x2 y) x y 2
2
k
)
,
H
k
(k 2
)
,
,
H
k
(k n
)
A(k 1)
1(
k
1)
,
(k 2
1)
,
,
(k n
1)
a(2) 11 0
a(2) 1k
Hk
A(k )
Hk
0
a(k) kk
0
0
a(k) nk
a(2) 1n
a(k kn
)
a(k) nn
H
(
k1
k
)
,
H
k
(k 2
)
,
,
H
k
(k n
)
a1(12) 0 0 0
迭代格式
Ak Qk Rk Ak 1 RkQk
(k 1, 2, ).
将A A1化成相似的上三角阵(或分块上三角阵),
从而求出矩阵A的全部特征值与特征向量。
由A A1 Q1R1 ,即Q11 A R1。 于是A2 R1Q1 Q1 AQ1 ,即A2与A相似。
同理可得,Ak A (k 2, 3, )。 故它们有相同的特征值。

数值分析(07)矩阵的正交分解

数值分析(07)矩阵的正交分解
数值分析
Householder变换与矩阵的正交分解 第六节 Householder变换与矩阵的正交分解
一、初等反射阵(Householder变换阵) 初等反射阵(Householder变换阵) (Householder变换阵
定义 设非零向量W ∈ R ,W = ( w1 , w2 ,L , wn ) , 且满足条件 W 2 = 1, 形如
数值分析
T
数值分析
H阵的性质: 阵的性质: 阵的性质 T det( H ) = 1 − 2W W = −1 (1)非奇异
(2)对称正交 T H=H HH T = H 2 = ( I − 2WW T )( I − 2WW T ) = I − 4WW T + 4WW TWW T = I
2 1 − 2w1 −2w2 w1 H= L −2wn w1
故 取 K = −σ 3 = − 3 于 是 y = −σ 3 e 3 = Ke 3 = (0, 0, − 3, 0)T ,
U = x − y = (2, 0, 5,1)T , ρ = σ 3 (σ 3 + x3 ) = 3(3 + 2) = 15
ρ = U TU
1 2
H =I−
1
ρ
UU
T
11 0 1 = 15 − 10 −2
数值分析
数值分析
1 例:W = 2
1 3 0 ∈ R ,|| W ||2 = 1 2 1 2 1 1 T H = I − 2WW = I − 2 0 0 2 1 2 2 0 0 −1 =0 1 0 −1 0 0
数值分析
例 已 知 向 量 x = (2, 0, 2,1)T , 试 构 造 Householder阵 , 使 Hx = Ke 3 , 其 中 e 3 = (0, 0,1, 0)T ∈ R 4 , K ∈ R。

矩阵程序大作业—说明文档

矩阵程序大作业—说明文档

2) 当输入矩阵A不是方阵 例:
(1)LU分解
(2)QR分解
显示结果中变量含义:Q:R(A)的单位正交基为列组成的矩阵;R:上 三角阵。
(3)Householder reduction
显示结果中变量含义:P_H:由反射得到的单位正交阵(unitary matrix or orthogonal matrix);T_H:上梯形阵;P_T_H:P_H的转置。(后缀_H 用于与Givens的结果区分)
P_G %由反射得到的单位正交阵; T_G %上梯形阵; P_T_G %P_G的转置; end
2) Factorization_and_Reduction.m
%-----------------------------------%函数名称:Factorization_and_Reduction %函数功能:对矩阵进行LU分解,QR分解,Household reduction,Givens reduction %输入参数:A:待分解的矩阵 % mode:工作模式的选择 % mode=0:函数进行LU分解 % mode=1:函数进行QR分解 % mode=2:函数进行Householder reduction % mode=3:函数进行Givens reduction %输出参数:flag_right:分解或约减成功标志,为0时表示失败,为 1时表示成功 % B1,B2,B3,在不同模式下的含义如下 % mode=0:B1=L:下三角阵; % B2=U:上三角阵; % B3=P:permutation matrix; % 满足PA=LU。 % mode=1:B1=Q:R(A)的单位正交基为列组成的 矩阵; % B2=R:上三角阵; % B3=0:没有实际意义,默认值为0; % 满足A=QR。 % mode=2:B1=P:由反射得到的单位正交阵 (unitary matrix or orthogonal matrix); % B2=T:上梯形阵; % B3=P_T:P的转置; % 满足PA=T和A=P_T*T。 % mode=3:B1=P:由旋转得到的单位正交阵 (unitary matrix or orthogonal matrix); % B2=T:上梯形阵; % B3=P_T:P的转置; % 满足PA=T和A=P_T*T。

c语言矩阵计算

c语言矩阵计算

c语言矩阵计算(原创版)目录1.矩阵计算概述2.C 语言矩阵计算的基本原理3.C 语言矩阵计算的常用算法4.C 语言矩阵计算的实际应用5.总结正文【1.矩阵计算概述】矩阵计算是一种数学计算方法,主要处理矩阵相关的数值计算问题。

矩阵在现代数学、物理、工程等领域具有广泛的应用,因此,研究矩阵计算的方法和技巧具有重要的意义。

C 语言作为一种广泛应用的编程语言,在矩阵计算领域也有着不俗的表现。

本文将介绍 C 语言矩阵计算的基本原理、常用算法以及实际应用。

【2.C 语言矩阵计算的基本原理】C 语言矩阵计算的基本原理主要包括以下几个方面:(1)矩阵的表示:矩阵是一个二维数组,可以用一维数组表示。

在 C 语言中,我们可以通过定义一个二维数组来表示一个矩阵。

(2)矩阵的运算:矩阵的运算包括矩阵加法、矩阵乘法、矩阵转置等。

在 C 语言中,我们可以通过循环实现这些运算。

(3)矩阵的存储:为了方便矩阵计算,我们需要对矩阵进行存储。

在 C 语言中,我们可以使用动态内存分配函数 malloc() 来分配内存,并使用数组存储矩阵元素。

【3.C 语言矩阵计算的常用算法】C 语言矩阵计算的常用算法包括以下几个方面:(1)高斯消元法:高斯消元法是一种常用的矩阵求解方法,可以用于解线性方程组。

在 C 语言中,我们可以通过循环实现高斯消元法。

(2)LU 分解:LU 分解是一种常用的矩阵分解方法,可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积。

在 C 语言中,我们可以通过交换矩阵元素的位置,然后使用高斯消元法实现 LU 分解。

(3)矩阵求幂:矩阵求幂是一种常用的矩阵运算,可以用于求解矩阵的 n 次幂。

在 C 语言中,我们可以通过定义一个函数来实现矩阵求幂。

【4.C 语言矩阵计算的实际应用】C 语言矩阵计算在实际应用中具有广泛的应用,包括以下几个方面:(1)线性规划:线性规划是一种常用的数学优化方法,可以用于求解最优化问题。

在 C 语言中,我们可以使用矩阵计算方法实现线性规划。

计算方法数值分析C语言源程序

计算方法数值分析C语言源程序

第1章线性方程组的直接算法求解线性方程组的直接算法是基于矩阵分解的算法。

常见的矩阵分解有两种:1.矩阵的三角分解矩阵的三角就是把一个矩阵分解成两个三角形矩阵的乘积。

比如:简单的三角分解:,这里,是单位下三角矩阵,是上三角矩阵。

列主元三角分解:,这里,是初等置换阵,是单位下三角矩阵且各元素的模不超过1,是上三角矩阵。

全主元三角分解:,这里,,是初等置换阵,是单位下三角矩阵且元素的模不超过,是上三角矩阵。

2.矩阵的正交三角分解正交化三角化就是把一个矩阵分解成一个正交矩阵和一个上三角矩阵的乘积.即,这里是正交矩阵,是上三角矩阵.1.1 矩阵的三角分解1.1.1 功能把实矩阵分解成单位下三角形矩阵和上三角形矩阵的乘积.即.该算法适用于各阶顺序主子式不等于的矩阵.1.1.2 算法概述所谓三角分解就是把阶方阵作如下分解其中是单位下三角矩阵,上三角矩阵。

当时,构造Gauss变换则以此类推,只要对角线上的元素,便可以一直这样做下去。

直到将其化为上三角矩阵为止。

即有.其中,且从而有而且.综上所述,我们可以将两个矩阵因子继续存储在原矩阵的存储空间上.的主对角线上的1不予存储.算法5.3(计算三角分解:Gauss消去法)1.1.3 算法程序1.1.3.1.1 参数说明**a n阶矩阵; n 矩阵的阶;1.1.3.1.2 C程序bool GaussLU(double **a,int n)//n阶矩阵的LU分解{for(int k=0;k<n-1;k++){if(a[k][k]==0)return false;for(int i=k+1;i<n;i++){a[i][k]/=a[k][k];for(int j=k+1;j<n;j++)a[i][j]-=a[i][k]*a[k][j];}}return true;}1.1.4 例题求矩阵1 2 3 41 4 9 161 8 27 64的三角分解,结果如下:1 2 3 41 2 6 121 3 6 241 7 6 241.2 列主元三角分解1.2.1 功能用矩阵的列主元三角分解,分解矩阵:,这里,是初等置换阵,是单位下三角矩阵且各元素的模不超过1,是上三角矩阵。

LU分解C程序实现

LU分解C程序实现

LU分解C程序实现LU分解是一种常用于解线性方程组的数值方法。

它将一个方阵分解为一个下三角矩阵和一个上三角矩阵的乘积。

这种分解可以简化解方程组的过程,并且可以重复使用分解结果来求解具有不同右侧向量的方程组。

在C语言中,可以使用数组和循环来实现LU分解。

LU分解的算法可以分为两个步骤:LU分解和矩阵求解。

首先,我们需要将原始方阵分解为一个下三角矩阵L和一个上三角矩阵U。

然后,我们使用这些矩阵来求解线性方程组。

下面是一个使用C语言实现LU分解的样例代码:```c#include <stdio.h>//定义矩阵维度#define N 3//打印矩阵void printMatrix(float A[N][N])for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)printf("%f ", A[i][j]);}printf("\n");}printf("\n");//LU分解//初始化下三角矩阵L和上三角矩阵U for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)if (i == j)L[i][j]=1.0;U[i][j]=A[i][j];} else if (i < j)L[i][j]=0.0;U[i][j]=A[i][j];} elseL[i][j]=A[i][j];U[i][j]=0.0;}}}//执行LU分解for (int k = 0; k < N - 1; k++)for (int i = k + 1; i < N; i++)float factor = U[i][k] / U[k][k];L[i][k] = factor;for (int j = k; j < N; j++)U[i][j] -= factor * U[k][j];}}}//解方程组void solveEquations(float A[N][N], float b[N], float x[N]) float L[N][N], U[N][N];//执行LU分解//求解Ly=bfloat y[N];for (int i = 0; i < N; i++)float sum = 0.0;for (int j = 0; j < i; j++)sum += L[i][j] * y[j];}y[i] = (b[i] - sum) / L[i][i];}//求解Ux=yfor (int i = N - 1; i >= 0; i--)float sum = 0.0;for (int j = i + 1; j < N; j++)sum += U[i][j] * x[j];}x[i] = (y[i] - sum) / U[i][i];}int maifloat A[N][N] = {{3, 1, -1}, {2, -7, 2}, {-6, -3, 5}}; float b[N] = {6, 3, 4};float x[N];printf("原始矩阵A:\n");printMatrix(A);printf("右侧向量b:\n");for (int i = 0; i < N; i++)printf("%f\n", b[i]);}printf("\n");//解方程组solveEquations(A, b, x);printf("解向量x:\n");for (int i = 0; i < N; i++)printf("%f\n", x[i]);}return 0;```这个样例代码实现了LU分解和线性方程组的求解。

工程数学(07)矩阵的正交分解

工程数学(07)矩阵的正交分解

工程数学
工程数学
算法1 算法
1、 输 入 x = ( x 1 , x 2 , L , x n ) T 。
给定向量 x ≠ 0, 计算初等反射阵 H 1。
2、 将 x 规 范 化 , M = m a x { x 1 , x 2 , L , x n 如 果 M = 0,则 转 出 停 机 否 则 z i ← x i / M , i = 1, 2 , L , n
因为 x − y
2 2
x− y 2 T T T T = ( x − y )( x − y ) = 2( x x − y x )
= x−2
2
代入上式后即得到 Hx = y Q x T x = y T y , xT y = yT x
工程数学
工程数学
1. Householder 变 换 可 以 将 给 定 的 向 量 变 为 一 个 与 任 一 个 ei ∈ R n ( i = 1, 2,L , n )同 方 向 的 向 量 。
工程数学
Householder变换与矩阵的正交分解 第六节 Householder变换与矩阵的正交分解
一、初等反射阵(Householder变换阵) 初等反射阵(Householder变换阵) (Householder变换阵
定义 设非零向量W ∈ R ,W = ( w1 , w2 ,L , wn ) , 且满足条件 W 2 = 1, 形如
0 1 0 0
− 10 0 − 10 −5
−2 0 −5 14
工程数学
工程数学
2. 构 造 H 阵 , 将 向 量 x = ( x 1 , L , x k , x k + 1 , L , x n ) T 的 后 面 n − k 个 分 量 约 化 为 零 (1 ≤ k < n )。 即 : 任 给 定 x = ( x1 , x 2 ,L , x n )T ≠ 0, 构 造 H k ∈ R n× n , 使 H k x = ( x1 , x 2 ,L , x k −1 , −σ k , 0,L , 0)T

c语言实现矩阵的相关操作

c语言实现矩阵的相关操作

c语言实现矩阵的相关操作-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN算法分析与设计课程论文—通过C语言实现矩阵的相关操作一.摘要本文在Microsoft Visual Studio 2010的编译环境下,通过C语言进行一些矩阵的基本操作,包括矩阵的设置,加减乘除,数乘运算。

求矩阵的逆等操作。

关键词矩阵 C语言逆矩阵二.正文1.引言矩阵的相关知识只是是高等数学的基础,但是其庞大的运算量和纷繁的步骤让人却步。

虽然有Matlab等软件可以实现矩阵的相关操作,但是我校一些专业并不学习数学实验,故通过C语言实现矩阵的操作也是一种可行的方法,本文列举的了一些矩阵的加减乘除等基本运算规则,还有对矩阵进行转置,也有矩阵求逆的相关操作。

同时,还介绍了行列式的计算,通过运行该程序,可以大大简化行列式的计算量。

2.算法分析矩阵的初始化相关概念在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。

这一概念由19世纪英国数学家凯利首先提出。

矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。

在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。

矩阵的运算是数值分析领域的重要问题。

将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。

对一些应用广泛而形式特殊的矩阵,例如稀疏矩阵和准对角矩阵,有特定的快速运算算法。

理论分析在C语言中,可以使用二维数组来描绘一个矩阵。

值得注意的是,在二维数组中,必须标明列数,否则编译器就会报错。

故二维极其多维数组使用时要注意数组下标。

代码实现#include<>int main(){int juzheng [100][100];int i , j , a , b ;printf("请输入矩阵的行数a 列数b \n") ;scanf ("%d %d",&a,&b);for (i = 0;i < a ;i++){for (j = 0;j < b ;j++){scanf ("%d",&juzheng[i][j]);}}printf ("你所输入的矩阵是:\n");for (i = 0;i < a ;i++){for (j = 0;j < b ;j++){printf("%d ",juzheng[i][j]);}printf ("\n");}return 0;}矩阵的相加相关概念加法矩阵的加法满足下列运算律(A,B,C都是同型矩阵):A+B=B+AA+B+C=A+(B+C)应该注意的是只有同型矩阵之间才可以进行加法理论分析:矩阵相加就是将两个矩阵的相同位置的元素相加,相加的值输出,通过循环语句,可以很好的实现该过程,如果要改成减法的话,就可以改成printf(“%d”,juzhen1[i][j]-juzhen2[i][j])。

矩阵四种分解:PALU,QR,Household,Givens的c程序

矩阵四种分解:PALU,QR,Household,Givens的c程序

modu=sqrt((*(arrt+i*n+j))*(*(arrt+i*n+j))+modu*modu); } for(i=j;i<m;i++) //求单次的R矩阵 for(l=j;l<m;l++) { *(R+i*m+l)=-2*(*(arrt+i*n+j))*(*(arrt+l*n+j))/modu/modu; } for(i=j;i<m;i++) { *(R+i*m+i)=1+(*(R+i*m+i)); } for(i=0;i<j;i++) for(l=0;l<m;l++) { if(i==l) { *(R+i*m+l)=1; } else { *(R+i*m+l)=*(R+l*m+i)=0; } } matrixmul(R,H,Rsum,m,m,m); for(i=0;i<m;i++) for(l=0;l<m;l++) { *(H+i*m+l)=*(Rsum+i*m+l); } matrixmul(Rsum,arr,arrt,m,m,n); } for(i=0;i<m;i++) for(l=0;l<m;l++) { *(RT+i*m+l)=*(Rsum+l*m+i); }
#include "stdio.h" #include "malloc.h" #include "math.h" void ScanMatrix(float *arr,int m,int n); //输入矩阵 void matrixmul(float*arr1,float*arr2,float*arr3,int m,int n,int k); //矩阵 数乘函数 void printm(char c,float*arr,int m,int n); //矩阵打印函数 void PALU(float *arr,int m,int n); //PA=LU分解函数 void Gram_Schmint(float *arr,int m,int n); //QR分解函数 void Household(float *arr,int m,int n); //household分解 函数 void Givens(float *arr,int m,int n); //givens分解函数 void divide(); //分解矩阵总函数 int main() { divide(); return 0; } void divide() { int m,n,method,flag=1; char c='0'; while(c!='#') { printf("请输入mXn矩阵维度m:"); scanf("%d",&m); printf("请输入mXn矩阵维度n:"); scanf("%d",&n); float *arr= (float *)malloc(sizeof (float) * m*n); ScanMatrix(arr,m,n); while(flag) { printf("请输入矩阵的分解方式:\n1-PA=LU,\n2-Gram-Schmit正交化 A=QR,\n3-Household分结束分解.\n"); scanf("%d",&method); switch(method)

c语言矩阵计算

c语言矩阵计算

c语言矩阵计算摘要:一、引言1.C 语言简介2.矩阵计算在实际应用中的重要性二、C 语言矩阵表示1.矩阵的定义2.矩阵的常见数据结构3.矩阵的初始化方法三、C 语言矩阵基本操作1.矩阵的加法与减法2.矩阵的数乘与乘法3.矩阵的转置4.矩阵的求逆四、C 语言矩阵求解1.高斯消元法求解矩阵方程2.LU 分解法求解矩阵方程3.矩阵的特征值与特征向量计算五、C 语言矩阵应用案例1.图像处理中的矩阵计算2.机器学习中的矩阵计算六、总结正文:C 语言作为一种广泛应用的编程语言,具有高效性和灵活性。

在科学研究和工程应用中,矩阵计算是一个重要的领域。

本文将介绍如何在C 语言中进行矩阵计算。

首先,我们需要了解C 语言中矩阵的表示方法。

矩阵是一个二维数组,可以用行优先或列优先的方式存储。

在C 语言中,我们可以使用一维数组或者结构体来表示矩阵。

例如,我们可以用一个一维数组来表示一个3x3 的矩阵:```c#include <stdio.h>int main() {int matrix[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};printf("Matrix:");for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {printf("%d ", matrix[i * 3 + j]);}printf("");}return 0;}```接下来,我们来看一下C 语言中矩阵的基本操作。

矩阵的加法与减法可以通过对应元素相加或相减实现。

矩阵的数乘与乘法可以通过将矩阵的每个元素与相应的数或矩阵相乘实现。

矩阵的转置可以通过交换矩阵的行与列实现。

矩阵的求逆可以通过高斯消元法、LU 分解法等方法实现。

在实际应用中,矩阵计算常用于图像处理、机器学习等领域。

例如,在图像处理中,我们需要对图像进行滤波、边缘检测等操作,这些操作都涉及到矩阵计算。

C语言实现方阵的LU分解

C语言实现方阵的LU分解

C语言实现方阵的LU分解LU分解是一种重要的数值运算方法,用于将一个方阵分解为两个三角方阵的乘积,即下三角方阵L和上三角方阵U。

LU分解在数值计算中有着广泛的应用,例如求解线性方程组、计算矩阵的行列式和逆矩阵等。

C语言作为一种广泛应用于科学计算和数值分析领域的编程语言,提供了丰富的数值计算库,使得实现LU分解变得相对简单。

下面将使用C 语言来实现方阵的LU分解。

首先,我们需要定义一个方阵的结构体,以便操作方便。

方阵结构体中包含一个二维数组和方阵的维度。

```ctypedef structint size;double **elements;} Matrix;```接下来,我们需要编写几个用于操作方阵的函数。

下面是几个常用的函数:1.创建方阵:根据给定的维度创建一个方阵,并初始化为零。

```cMatrix createSquareMatrix(int size)Matrix matrix;matrix.size = size;matrix.elements = (double **)malloc(size * sizeof(double *)); for (int i = 0; i < size; i++)matrix.elements[i] = (double *)calloc(size, sizeof(double)); }return matrix;```2.释放方阵:释放方阵占用的内存。

```cvoid destroySquareMatrix(Matrix matrix)for (int i = 0; i < matrix.size; i++)free(matrix.elements[i]);}free(matrix.elements);```3.打印方阵:将方阵的元素打印到屏幕上。

```cvoid printSquareMatrix(Matrix matrix)for (int i = 0; i < matrix.size; i++)for (int j = 0; j < matrix.size; j++)printf("%8.2lf ", matrix.elements[i][j]);}printf("\n");}```有了这些函数,我们就可以开始实现方阵的LU分解了。

C语言实现矩阵的LU分解、施密特正交化、Givens分解、Householder分解

C语言实现矩阵的LU分解、施密特正交化、Givens分解、Householder分解

C语言实现矩阵的LU分解、施密特正交化、Givens分解、Householder分解By Kim.Wang,UCAS#include<stdio.h>#include<math.h>#include<windows.h>#define HS 10#define LS 10int n, m;float a[HS][LS],bc[HS][LS];void givens(){float fm,sc,cos,sin,r[HS][LS],q[HS][LS],swap[HS][LS],p[HS][LS];int ih,jh,i, j,kh,iw;for (i = 0; i < m; i++)for (j = 0; j < n; j++)r[i][j]=a[i][j];for (i = 0; i < m; i++)for (j = 0; j < m; j++){if(i==j)q[i][j]=1;elseq[i][j]=0;}for(j=0;j<n;j++)for (i = j+1; i < m; i++){for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){if(ih==jh)p[ih][jh]=1;elsep[ih][jh]=0;}fm=sqrt(r[i][j]*r[i][j]+r[j][j]*r[j][j]);cos=r[j][j]/fm;sin=r[i][j]/fm;p[i][i]=p[j][j]=cos;p[i][j]=-sin;p[j][i]=sin;for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++){sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*r[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++)r[ih][jh]=swap[ih][jh];for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*q[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++)q[ih][jh]=swap[ih][jh];}printf("\n Givens约减矩阵Q的结果如下:\n");for (j = 0; j < m; j++){for (i = 0; i < m; i++)printf("%0.5f ", q[i][j]);printf("\n");}printf("\n Givens约减矩阵R的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < n; j++)printf("%0.5f ", r[i][j]);printf("\n");}}void householder(){int i, j, k, is,js,ks,iw, ie,je;float udm,sc,em,nj,q[HS][LS],r[HS][LS],u[LS],swap[HS][LS],dw[HS][LS],p[HS][LS];for (i = 0; i < m; i++)for (j = 0; j < n; j++)r[i][j]=a[i][j];for (i = 0; i < m; i++)for (j = 0; j < m; j++){if(i==j)dw[i][j]=q[i][j]=1;elsedw[i][j]=q[i][j]=0;}for(k=0;k<n;k++){for (i = 0; i < m; i++){if(i<k)u[i]=0;else if(i==k){em=0;for(iw=k;iw<m;iw++)em=em+r[iw][k]*r[iw][k];em=sqrt(em);u[i]=r[i][k]-em;}elseu[i]=r[i][k];}for (udm=0,ie = k; ie < m; ie++)udm=udm+u[ie]*u[ie];udm=sqrt(udm);if(udm<0.00001)break;for (ie = 0; ie < m; ie++)u[ie]=u[ie]/udm;for (ie = 0; ie < m; ie++)for (je = 0; je < m; je++)p[ie][je]=dw[ie][je]-2*u[ie]*u[je];for (is = 0; is < m; is++)for (js = 0; js < m; js++){sc=0;for (ks = 0; ks < m; ks++)sc=sc+p[is][ks]*q[ks][js];swap[is][js]=sc;}for (is = 0; is < m; is++)for (js = 0; js < m; js++)q[is][js]=swap[is][js];for (is = 0; is < m; is++)for (js = 0; js < m; js++){sc=0;for (ks = 0; ks < m; ks++)sc=sc+p[is][ks]*r[ks][js];swap[is][js]=sc;}for (is = 0; is < m; is++)for (js = 0; js < m; js++)r[is][js]=swap[is][js];}printf("\n Householder约减矩阵Q的结果如下:\n");for (j = 0; j < m; j++){for (i = 0; i < m; i++)printf("%0.5f ", q[i][j]);printf("\n");}printf("\n Householder矩阵R的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < n; j++)printf("%0.5f ", r[i][j]);printf("\n");}}void schmidt(){int i, j, k, l, b, z;float em,nj, r[HS][LS],q[HS][LS];for (i = 0; i < m; i++)for (j = 0; j < n; j++)q[i][j]=a[i][j];for(k=0;k<n;k++){for(l=0;l<k;l++){nj=0;for(i=0;i<m;i++)nj=nj+q[i][l]*a[i][k];r[l][k]=nj;for(i=0;i<m;i++)q[i][k]=q[i][k]-r[l][k]*q[i][l];}em=0;for(i=0;i<m;i++)em=em+q[i][l]*q[i][l];em=sqrt(em);r[l][k]=em;for(i=0;i<m;i++)q[i][k]=q[i][k]/r[l][k];}for(i=0;i<m;i++)for(j=n;j<m;j++)q[i][j]=bc[i][j];printf("\n Schmidt正交化矩阵Q的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < m; j++)printf("%0.5f ", q[i][j]);printf("\n");}printf("\n Schmidt正交化矩阵R的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < n; j++){if(i>j) r[i][j]=0;printf("%0.5f ", r[i][j]);}printf("\n");}}void lufj(){int i, j, k,mm, z, o, p[HS][LS], w[HS];float x, y,alu[HS][LS], s[HS],l[HS][LS],u[HS][LS]; for (i = 0; i < n; i++)for (j = 0; j < n; j++){alu[i][j]=a[i][j];if (i == j)p[i][j] = 1;elsep[i][j] = 0;}for (j = 0; j < n; j++){i = j; x = alu[i][j]; k = i;for (; i < n - 1; i++){mm = i + 1;if (abs(x) < abs(alu[mm][j])){k = mm;x = alu[mm][j];}}if (k != j)for (o = 0,i = j; o < n; o++){s[o] = alu[i][o];alu[i][o] = alu[k][o];alu[k][o] = s[o];w[o] = p[i][o];p[i][o] = p[k][o];p[k][o] = w[o];}for (z = j + 1; z < n; z++){y = alu[z][j] / alu[j][j];alu[z][j] = y;for (o = j+1; o < n; o++)alu[z][o] = alu[z][o] - y*alu[j][o];}}for (i = 0; i < n; i++)for (j = 0; j < n; j++)if(i>j){l[i][j]=alu[i][j];u[i][j]=0;}else if(i<j){l[i][j]=0;u[i][j]=alu[i][j];}else{l[i][j]=1;u[i][j]=alu[i][j];}printf(" LU分解矩阵L的结果如下:\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%0.5f ", l[i][j]);printf("\n");}printf("\n LU分解矩阵U的结果如下:\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%0.5f ", u[i][j]);printf("\n");}printf("\n LU分解行交换矩阵P的结果如下:\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%d ", p[i][j]);printf("\n");}}int main(){int im,jm,b,z,zl;printf("请输入矩阵行数M(M需为大于1的整数):\n");scanf("%d",&m);printf("请输入矩阵列数N(N需为大于1的整数):\n");scanf("%d",&n);for (im = 0; im < m; im++)for (jm = 0; jm < n; jm++){b = im + 1;z = jm + 1;printf("请输入第%d行的第%d个数,以enter键结束输入:\n", b, z);scanf("%f", &a[im][jm]);}float fm,sc,cos,sin,jdz,r[HS][LS],q[HS][LS],swap[HS][LS],p[HS][LS];int ih,jh,i, j,kh,iw;for (i = 0; i < m; i++)for (j = 0; j < n; j++)r[i][j]=a[i][j];for (i = 0; i < m; i++)for (j = 0; j < m; j++){if(i==j)q[i][j]=1;elseq[i][j]=0;}for(j=0;j<n;j++)for (i = j+1; i < m; i++){for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){if(ih==jh)p[ih][jh]=1;elsep[ih][jh]=0;}fm=sqrt(r[i][j]*r[i][j]+r[j][j]*r[j][j]);cos=r[j][j]/fm;sin=r[i][j]/fm;p[i][i]=p[j][j]=cos;p[i][j]=-sin;p[j][i]=sin;for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++)sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*r[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++)r[ih][jh]=swap[ih][jh];for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*q[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++)bc[jh][ih]=q[ih][jh]=swap[ih][jh];}if(r[n-1][n-1]<0)jdz=-r[n-1][n-1];elsejdz=r[n-1][n-1];if(m<n){printf("\n 该矩阵列向量线性相关,无法进行分解! \n");system("pause");}else if(jdz<0.0001){printf("\n 该矩阵列向量线性相关,无法进行分解! \n");system("pause");}else if(m==n){do{printf("\n");printf("该矩阵可进行四种分解,请输入选项前的数字选择!\n");printf("0:退出程序\n");printf("1:Gram-Schmidt正交化\n");printf("2:Householder分解\n");printf("3:Givens分解\n");printf("4:LU分解\n\n");scanf("%d", &zl);switch(zl){case 0:return 0; break;case 1:schmidt(); break;case 2:householder(); break;case 3:givens(); break;case 4:lufj(); break;}}while(zl!=0);}elsedo{printf("\n");printf("该矩阵可进行除LU分解外的三种分解,请输入选项前的数字选择!\n");printf("0:退出程序\n");printf("1:Gram-Schmidt正交化\n");printf("2:Householder分解\n");printf("3:Givens分解\n\n");scanf("%d", &zl);switch(zl){case 0:return 0; break;case 1:schmidt(); break;case 2:householder(); break;case 3:givens(); break;}}while(zl!=0);}。

矩阵LU分解求逆详细分析与C语言实现

矩阵LU分解求逆详细分析与C语言实现

题目要求给定一个多维矩阵,实现该矩阵的求逆运算。

1、理论分析矩阵的一种有效而广泛应用的分解方法是矩阵的LU三角分解,将一个n阶矩阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积。

所以首先对矩阵进行三角分解,这里采用Doolittle分解,即分解为一个下三角矩阵(对角元素为1),和一个上三角矩阵的乘积。

再进行相应的处理。

所以,矩阵求逆的算法流程可表述如下:图1 矩阵求逆流程图1)进行LU分解;2)对分解后的L 阵(下三角矩阵)和U 阵(上三角矩阵)进行求逆;; 3)L 阵的逆矩阵和U 阵的逆矩阵相乘,即可求得原来矩阵的逆。

即:1111()A LU U L ----== (1)1.1矩阵的LU 分解若n 阶方阵nn nCA *∈的各阶顺序主子式不等于零,即:),,,2,1(,0212222111211n k akkak ak k a a a k a a a k ΛΛM MMMΛΛ=≠=∆ (2)则A 的LU 分解A L U =⨯存在且唯一。

111111111111111rn r rr rn n nr nn r n r rrrn n nrnn a a a A a a a a a a U U U L U U LUL L U ⎡⎤⎢⎥⎢⎥⎢⎥==⎢⎥⎢⎥⎢⎥⎣⎦⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦LLM M M LL M M M L L L L M O O M L L MM O OM K L (3)由矩阵的乘法原理, 可推导出LU 分解的迭代算法(4)000,(0,1,2,,1),i i a l i n u ==-L (5)1111,(0,1,2,,1;,,1),r rj ik kjr k rj rj rk kj k rra l u u a l u l r n j r n --==-==-=-=-∑∑L L (6)00,(0,1,2,,1),j j U a j n ==-L11,(0,1,2,,1;1,,1)r ir ik krk ir rra l u l u r n i r n -=-==-=+-∑L L (7)矩阵的LU 分解是一个循环迭代的过程, U 矩阵是从第1行迭代到第n 行, 而L 矩阵则是从第1列迭代到第n 列, 且U 矩阵先于L 矩阵一个节拍。

利用C程序编写格拉姆-施密特正交化的过程

利用C程序编写格拉姆-施密特正交化的过程

利用C程序编写格拉姆-施密特正交化的过程∙:维数为n的内积空间∙:中的元素,可以是向量、函数,等等∙:与的内积∙:、……张成的子空间∙:在上的投影基本思想Gram-Schmidt正交化的基本想法,是利用投影原理在已有正交基的基础上构造一个新的正交基。

设。

是上的维子空间,其标准正交基为,且不在上。

由投影原理知,与其在上的投影之差是正交于子空间的,亦即正交于的正交基。

因此只要将单位化,即那么就是在上扩展的子空间的标准正交基。

根据上述分析,对于向量组张成的空间 (),只要从其中一个向量(不妨设为)所张成的一维子空间开始(注意到就是的正交基),重复上述扩展构造正交基的过程,就能够得到的一组正交基。

这就是Gram-Schmidt正交化。

首先需要确定已有基底向量的顺序,不妨设为。

Gram-Schmidt 正交化的过程如下:这样就得到上的一组正交基,以及相应的标准正交基。

例考察如下欧几里得空间R n中向量的集合,欧氏空间上内积的定义为<a, b> = b T a:下面作Gram-Schmidt正交化,以得到一组正交向量:下面验证向量与的正交性:将这些向量单位化:于是就是的一组标准正交基底。

随着内积空间上内积的定义以及构成内积空间的元素的不同,Gram-Schmidt正交化也表现出不同的形式。

例如,在实向量空间上,内积定义为:在复向量空间上,内积定义为:函数之间的内积则定义为:与之对应,相应的Gram-Schmidt正交化就具有不同的形式。

利用C程序编写格拉姆-施密特正交化的过程C语言程序如下:#include <stdio.h>#include <math.h>#define N 3 //N表示基的个数#define M 4 //M表示维数float zj(float a[],float b[]) //这是求内积函数{int i;float k=0;for(i=0;i<M;i++)k+=a[i]*b[i];return k;}main(){float p[N][M],b[N][M],k[N];int i,j,m;for(i=0;i<N;i++){ printf("请输入第%d个向量:\n",i+1);for(j=0;j<M;j++)scanf("%f",p[i]+j);}for(i=0;i<N*M;i++)b[0][i]=p[0][i];//下面是正交化过程for(i=1;i<N;i++) //i表示第i个向量{ for(m=0;m<i;m++)k[m]=zj(b[i],b[m])/zj(b[m],b[m]); //k[m]表示正交化过程中向量前的系数for(j=0;j<M;j++) //j表示每个向量中的坐标for(m=0;m<i;m++)b[i][j]-=k[m]*b[m][j];}printf("正交化结果为:\n");for(i=0;i<N;i++){ printf("第%d个向量是:\n",i+1);for(j=0;j<M;j++)printf("%g ",b[i][j]);putchar('\n');}//下面是单位化过程for(i=0;i<N;i++)for(j=0;j<M;j++)p[i][j]=b[i][j]/sqrt(zj(b[i],b[i]));printf("\n单位化结果为:\n");for(i=0;i<N;i++){ printf("第%d个向量是:\n",i+1);for(j=0;j<M;j++)printf("%g ",p[i][j]);putchar('\n');}}实验结果如下:实践课总结:在这次实践课的课题讨论中,我所在的这个组个个都发挥自己得能动性。

C++实现矩阵对称正交化的示例代码

C++实现矩阵对称正交化的示例代码

C++实现矩阵对称正交化的⽰例代码1.python代码import numpy as npimport pandas as pddf=pd.DataFrame()df['fac_01']=(34, 45, 65)df['fac_02']=(56, 25, 94)print(df)print('------------------矩阵的特征跟D、和特征向量U-----------------------')D,U=np.linalg.eig(np.dot(df.T, df)) # 求矩阵的特征跟D、和特征向量Uprint(D,U,sep='\n')print('\n------------------对⾓矩阵-----------------------')print(np.diag(D**(-0.5)))print('\n------------------对称正交后的矩阵-----------------------')S = np.dot(np.dot(U, np.diag(D**(-0.5))), U.T) # 求过渡矩阵S = U* DEx *U'F_hat = np.dot(df, S) # 求对称正交后的矩阵print(F_hat)2.C++的Eigen库实现#include "Eigen/Dense"using namespace Eigen;int main(){//初始化MatrixXf A(3, 2);A(0,0) = 34;A(0,1) = 56;A(1,0) = 45;A(1,1) = 25;A(2,0) = 65;A(2,1) = 94;//⽣成正交矩阵MatrixXf AEx = A.transpose() * A;int nRowSize = AEx.rows();int nColSize = AEx.cols();//求特征根、特征向量SelfAdjointEigenSolver<Matrix2f> eigensolver(AEx);MatrixXf D = eigensolver.eigenvalues();MatrixXf U = eigensolver.eigenvectors();std::cout<<"特征根如下:" <<std::endl;nRowSize = D.rows();nColSize = D.cols();for(size_t i=0; i<nRowSize; i++){for(size_t j=0; j<nColSize; j++){std::cout<<D(i,j)<<" ";}std::cout<<std::endl;}std::cout<<"特征向量如下:" <<std::endl;nRowSize = U.rows();nColSize = U.cols();for(size_t i=0; i<nRowSize; i++){for(size_t j=0; j<nColSize; j++){std::cout<<U(i,j)<<" ";}std::cout<<std::endl;}//⽣成np.diag(D**(-0.5)))对⾓线矩阵MatrixXf DEx(2,2);for(size_t i=0; i<2; i++){for(size_t j=0; j<2; j++){if(i == j){DEx(i,j) = pow(D(i,0),-0.5);}else{DEx(i,j) = 0;}}}nRowSize = DEx.rows();nColSize = DEx.cols();std::cout<<"对⾓线矩阵如下:" <<std::endl;for(size_t i=0; i<nRowSize; i++){for(size_t j=0; j<nColSize; j++){std::cout<<DEx(i,j)<<" ";}std::cout<<std::endl;}//⽣成过度矩阵SMatrixXf S = U * DEx * U.transpose();//⽣成正交化矩阵MatrixXf R = A * S;nRowSize = R.rows();nColSize = R.cols();std::cout<<"正交化结果如下:" <<std::endl;for(size_t i=0; i<nRowSize; i++){for(size_t j=0; j<nColSize; j++){std::cout<<R(i,j)<<" ";}std::cout<<std::endl;}return 0;}3.结果对⽐到此这篇关于C++实现矩阵对称正交化的⽂章就介绍到这了,更多相关C++矩阵对称正交化内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言实现矩阵的LU分解、施密特正交化、Givens分解、Householder分解By Kim.Wang,UCAS#include<stdio.h>#include<math.h>#include<windows.h>#define HS 10#define LS 10int n, m;float a[HS][LS],bc[HS][LS];void givens(){float fm,sc,cos,sin,r[HS][LS],q[HS][LS],swap[HS][LS],p[HS][LS];int ih,jh,i, j,kh,iw;for (i = 0; i < m; i++)for (j = 0; j < n; j++)r[i][j]=a[i][j];for (i = 0; i < m; i++)for (j = 0; j < m; j++){if(i==j)q[i][j]=1;elseq[i][j]=0;}for(j=0;j<n;j++)for (i = j+1; i < m; i++){for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){if(ih==jh)p[ih][jh]=1;elsep[ih][jh]=0;}fm=sqrt(r[i][j]*r[i][j]+r[j][j]*r[j][j]);cos=r[j][j]/fm;sin=r[i][j]/fm;p[i][i]=p[j][j]=cos;p[i][j]=-sin;p[j][i]=sin;for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++){sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*r[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++)r[ih][jh]=swap[ih][jh];for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*q[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++)q[ih][jh]=swap[ih][jh];}printf("\n Givens约减矩阵Q的结果如下:\n");for (j = 0; j < m; j++){for (i = 0; i < m; i++)printf("%0.5f ", q[i][j]);printf("\n");}printf("\n Givens约减矩阵R的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < n; j++)printf("%0.5f ", r[i][j]);printf("\n");}}void householder(){int i, j, k, is,js,ks,iw, ie,je;float udm,sc,em,nj,q[HS][LS],r[HS][LS],u[LS],swap[HS][LS],dw[HS][LS],p[HS][LS];for (i = 0; i < m; i++)for (j = 0; j < n; j++)r[i][j]=a[i][j];for (i = 0; i < m; i++)for (j = 0; j < m; j++){if(i==j)dw[i][j]=q[i][j]=1;elsedw[i][j]=q[i][j]=0;}for(k=0;k<n;k++){for (i = 0; i < m; i++){if(i<k)u[i]=0;else if(i==k){em=0;for(iw=k;iw<m;iw++)em=em+r[iw][k]*r[iw][k];em=sqrt(em);u[i]=r[i][k]-em;}elseu[i]=r[i][k];}for (udm=0,ie = k; ie < m; ie++)udm=udm+u[ie]*u[ie];udm=sqrt(udm);if(udm<0.00001)break;for (ie = 0; ie < m; ie++)u[ie]=u[ie]/udm;for (ie = 0; ie < m; ie++)for (je = 0; je < m; je++)p[ie][je]=dw[ie][je]-2*u[ie]*u[je];for (is = 0; is < m; is++)for (js = 0; js < m; js++){sc=0;for (ks = 0; ks < m; ks++)sc=sc+p[is][ks]*q[ks][js];swap[is][js]=sc;}for (is = 0; is < m; is++)for (js = 0; js < m; js++)q[is][js]=swap[is][js];for (is = 0; is < m; is++)for (js = 0; js < m; js++){sc=0;for (ks = 0; ks < m; ks++)sc=sc+p[is][ks]*r[ks][js];swap[is][js]=sc;}for (is = 0; is < m; is++)for (js = 0; js < m; js++)r[is][js]=swap[is][js];}printf("\n Householder约减矩阵Q的结果如下:\n");for (j = 0; j < m; j++){for (i = 0; i < m; i++)printf("%0.5f ", q[i][j]);printf("\n");}printf("\n Householder矩阵R的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < n; j++)printf("%0.5f ", r[i][j]);printf("\n");}}void schmidt(){int i, j, k, l, b, z;float em,nj, r[HS][LS],q[HS][LS];for (i = 0; i < m; i++)for (j = 0; j < n; j++)q[i][j]=a[i][j];for(k=0;k<n;k++){for(l=0;l<k;l++){nj=0;for(i=0;i<m;i++)nj=nj+q[i][l]*a[i][k];r[l][k]=nj;for(i=0;i<m;i++)q[i][k]=q[i][k]-r[l][k]*q[i][l];}em=0;for(i=0;i<m;i++)em=em+q[i][l]*q[i][l];em=sqrt(em);r[l][k]=em;for(i=0;i<m;i++)q[i][k]=q[i][k]/r[l][k];}for(i=0;i<m;i++)for(j=n;j<m;j++)q[i][j]=bc[i][j];printf("\n Schmidt正交化矩阵Q的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < m; j++)printf("%0.5f ", q[i][j]);printf("\n");}printf("\n Schmidt正交化矩阵R的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < n; j++){if(i>j) r[i][j]=0;printf("%0.5f ", r[i][j]);}printf("\n");}}void lufj(){int i, j, k,mm, z, o, p[HS][LS], w[HS];float x, y,alu[HS][LS], s[HS],l[HS][LS],u[HS][LS]; for (i = 0; i < n; i++)for (j = 0; j < n; j++){alu[i][j]=a[i][j];if (i == j)p[i][j] = 1;elsep[i][j] = 0;}for (j = 0; j < n; j++){i = j; x = alu[i][j]; k = i;for (; i < n - 1; i++){mm = i + 1;if (abs(x) < abs(alu[mm][j])){k = mm;x = alu[mm][j];}}if (k != j)for (o = 0,i = j; o < n; o++){s[o] = alu[i][o];alu[i][o] = alu[k][o];alu[k][o] = s[o];w[o] = p[i][o];p[i][o] = p[k][o];p[k][o] = w[o];}for (z = j + 1; z < n; z++){y = alu[z][j] / alu[j][j];alu[z][j] = y;for (o = j+1; o < n; o++)alu[z][o] = alu[z][o] - y*alu[j][o];}}for (i = 0; i < n; i++)for (j = 0; j < n; j++)if(i>j){l[i][j]=alu[i][j];u[i][j]=0;}else if(i<j){l[i][j]=0;u[i][j]=alu[i][j];}else{l[i][j]=1;u[i][j]=alu[i][j];}printf(" LU分解矩阵L的结果如下:\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%0.5f ", l[i][j]);printf("\n");}printf("\n LU分解矩阵U的结果如下:\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%0.5f ", u[i][j]);printf("\n");}printf("\n LU分解行交换矩阵P的结果如下:\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%d ", p[i][j]);printf("\n");}}int main(){int im,jm,b,z,zl;printf("请输入矩阵行数M(M需为大于1的整数):\n");scanf("%d",&m);printf("请输入矩阵列数N(N需为大于1的整数):\n");scanf("%d",&n);for (im = 0; im < m; im++)for (jm = 0; jm < n; jm++){b = im + 1;z = jm + 1;printf("请输入第%d行的第%d个数,以enter键结束输入:\n", b, z);scanf("%f", &a[im][jm]);}float fm,sc,cos,sin,jdz,r[HS][LS],q[HS][LS],swap[HS][LS],p[HS][LS];int ih,jh,i, j,kh,iw;for (i = 0; i < m; i++)for (j = 0; j < n; j++)r[i][j]=a[i][j];for (i = 0; i < m; i++)for (j = 0; j < m; j++){if(i==j)q[i][j]=1;elseq[i][j]=0;}for(j=0;j<n;j++)for (i = j+1; i < m; i++){for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){if(ih==jh)p[ih][jh]=1;elsep[ih][jh]=0;}fm=sqrt(r[i][j]*r[i][j]+r[j][j]*r[j][j]);cos=r[j][j]/fm;sin=r[i][j]/fm;p[i][i]=p[j][j]=cos;p[i][j]=-sin;p[j][i]=sin;for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++)sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*r[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++)r[ih][jh]=swap[ih][jh];for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*q[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++)bc[jh][ih]=q[ih][jh]=swap[ih][jh];}if(r[n-1][n-1]<0)jdz=-r[n-1][n-1];elsejdz=r[n-1][n-1];if(m<n){printf("\n 该矩阵列向量线性相关,无法进行分解! \n");system("pause");}else if(jdz<0.0001){printf("\n 该矩阵列向量线性相关,无法进行分解! \n");system("pause");}else if(m==n){do{printf("\n");printf("该矩阵可进行四种分解,请输入选项前的数字选择!\n");printf("0:退出程序\n");printf("1:Gram-Schmidt正交化\n");printf("2:Householder分解\n");printf("3:Givens分解\n");printf("4:LU分解\n\n");scanf("%d", &zl);switch(zl){case 0:return 0; break;case 1:schmidt(); break;case 2:householder(); break;case 3:givens(); break;case 4:lufj(); break;}}while(zl!=0);}elsedo{printf("\n");printf("该矩阵可进行除LU分解外的三种分解,请输入选项前的数字选择!\n");printf("0:退出程序\n");printf("1:Gram-Schmidt正交化\n");printf("2:Householder分解\n");printf("3:Givens分解\n\n");scanf("%d", &zl);switch(zl){case 0:return 0; break;case 1:schmidt(); break;case 2:householder(); break;case 3:givens(); break;}}while(zl!=0);}。

相关文档
最新文档