线代导论之用编程实现A=LU的分解

这几天在听麻省理工Gilbert Strang教授的线性代数,其中讲到了高斯消元法等,又加上教授一直提及MATLAB运算思想,所以这个矩阵系列我将用C语言模拟实现MATLAB的内部计算(不一定对)

百科:在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。LU分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式。实现矩阵的LU分解。矩阵的三角分解又称LU分解,它是将一个矩阵分解成一个下三角矩阵L和一个上三角矩阵U的乘积,即A=LU。

LU分解在本质上是高斯消元法的一种表达形式。实质上是将A通过初等行变换变成一个上三角矩阵,其变换矩阵就是一个单位下三角矩阵。这正是所谓的杜尔里特算法:从下至上地对矩阵A做初等行变换,将对角线左下方的元素变成零,然后再证明这些行变换的效果等同于左乘一系列单位下三角矩阵,这一系列单位下三角矩阵的乘积的逆就是L矩阵,它也是一个单位下三角矩阵。这类算法的复杂度一般在(三分之二的n三次方) 左右

注意:当A的所有顺序主子式都不为0时,矩阵A可以分解为A=LU,且当L的对角元全为1时分解唯一

在MATLAB中是这样使用的LU函数使用语句:

Y = lu(A)
[L,U] = lu(A)
[L,U,P] = lu(A)
[L,U,P,Q] = lu(A)
[L,U,P,Q,R] = lu(A)

具体用c怎么实现的呢?当然你也可以用其他语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
//

// main.c

// A=LU分解

//

// Created by 杨旭磊 on 16/4/4.

// Copyright © 2016年 杨旭磊. All rights reserved.

//

include <stdio.h>

/第一种方法直接解出方程的根/

//void solve(float l[][100],float u[][100],float b[],float x[],int n)

//{int i,j;

// float t,s1,s2;

// float y[100];

// for(i=1;i<=n;i++) /* 第一次回代过程开始 */

// {s1=0;

// for(j=1;j<i;j++)

// {

// t=-l[i][j];

// s1=s1+t*y[j];

// }

// y[i]=(b[i]+s1)/l[i][i]; }

// for(i=n;i>=1;i--) /* 第二次回代过程开始 */

// {

// s2=0;

// for(j=n;j>i;j--)

// {

// t=-u[i][j];

// s2=s2+t*x[j];

// }

// x[i]=(y[i]+s2)/u[i][i];

// }

//}

//

//void main()

//{float a[100][100],l[100][100],u[100][100],x[100],b[100];

// int i,j,n,r,k;

// float s1,s2;

// for(i=1;i<=99;i++)/将所有的数组置零,同时将L矩阵的对角值设为1/

// for(j=1;j<=99;j++)

// {

// l[i][j]=0,u[i][j]=0;

// if(j==i) l[i][j]=1;

// }

//

// printf ("input n:\n");/输入方程组的个数/

// scanf("%d",&n);

// printf ("input array A:\n");/读取原矩阵A/

// for(i=1;i<=n;i++)

// for(j=1;j<=n;j++)

// scanf("%f",&a[i][j]);

// printf ("input array B:\n");/读取列矩阵B/

// for(i=1;i<=n;i++)

// scanf("%f",&b[i]);

// for(r=1;r<=n;r++)/求解矩阵L和U/

// {

// for(i=r;i<=n;i++)

// {

// s1=0;

// for(k=1;k<=r-1;k++)

// s1=s1+l[r][k]*u[k][i];

// u[r][i]=a[r][i]-s1;

// }

// for(i=r+1;i<=n;i++)

// {s2=0;

// for(k=1;k<=r-1;k++)

// s2=s2+l[i][k]*u[k][r];

// l[i][r]=(a[i][r]-s2)/u[r][r];

// }

// }

// printf("array L:\n");/输出矩阵L/

// for(i=1;i<=n;i++)

// {

// for(j=1;j<=n;j++)

// printf("%7.3f ",l[i][j]);

// printf("\n");

// }

// printf("array U:\n");/输出矩阵U/

// for(i=1;i<=n;i++)

// {

// for(j=1;j<=n;j++)

// printf("%7.3f ",u[i][j]);

// printf("\n");

// }

// solve(l,u,b,x,n);

// printf("解为:\n");

// for(i=1;i<=n;i++)

// printf("x%d=%f\n",i,x[i]);

//}

/第二种方法,只提供思路,部分printf未写/

void main(){

 

int i,j,k,m,n,q,r,t,y;

float a[100][100],c[100][100],d[100][100],l[100][100],u[100][100];

scanf("%d",&n);

/输入矩阵A/

for (i = 1; i < n + 1; i++) {

printf("输入矩阵第%d行元素:%d\n",i);

for (j = 1; j < n +1; j++) {

scanf("%f",&a[i][j]);

}

}

/判断A的各阶顺序主子式(矩阵A下标kk)是否全大于0,若不成立进行LU分解/

for (t = 1, k = d[1][1];t < n + 1;t++) {

if (d[1][1]==0) { //判断矩阵第一行是否为0,若为0则不分解

 

break;

 

}else{

for (i = t + 1; i < n + 1; i++) { //进行第t次行优先的所有元素的消元

 

m = d[i][t]/d[t][t]; //计算行乘数

 

for (j = t + 1; j < n; j++) {

 

d[q][j] = d[q][j] - m*d[t][j]; //计算每次不为0的元素的值

m = 0; //将m归零

 

}

 

n = d[t+1][t+1]; //取主元n

k *= n; //计算各阶的顺序主子式

 

}

}

}

/若可分解,进行LU分解,l为单位下三角矩阵,u为上三角矩阵/

for (r = 2; r < n + 1; r++) { //控制u的行数(L的列数)

 

for (j = r; j < n + 1; j++) { //控制u的第r行的j列变化

 

int x = 0; //初始化中间变量x

for (k = 1; k < r; k++) {

x += l[i][k] * u[k][r]; //求元素之前对应的行和列的元素和

l[i][r] = (c[i][r]-y)/u[r][r]; //计算矩阵l的第r列元素

}

}

}

//可以用两个for打印你想看到的l或u矩阵,在WordPress写代码是在太压抑了,下面就不写了,参考第一种

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,742评论 0 6
  • sì 支zhī茶chá 对duì 酒jiǔ,赋fù 对duì 诗shī,燕yàn子zi 对duì 莺yīng 儿é...
    每个人的孟母堂阅读 1,173评论 0 6
  • 早就听闻大名,放着很长时间没看,一是不敢,毕竟年代太久时间也不短,再有就是想找一个合适的时间欣赏神作。今天不知道看...
    ways阅读 1,124评论 0 0
  • 上到初中,山泰就被周围不适应的环境,学校一般有三类人,一群学习好的,一群玩的好的,聊的起来的,还有一群,不能说是一...
    想写出好文笔的孩子阅读 162评论 0 0
  • One figure of superior movie is the words are great. It m...
    光_武阅读 423评论 0 1