C语言实现矩阵的LU分解、施密特正交化、Givens分解、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方法

但 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)矩阵的正交分解

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语言矩阵计算(原创版)目录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语言源程序

第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分解。
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)矩阵的正交分解

工程数学
工程数学
算法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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);}。