好吧,继续上来吐槽。。。昨天改了一晚上,今天查了一早上。一块一块的改,一点一点的查,终于把这个LU分解给写出来了。发现错误居然是打错了一个字母,本来该用这个数组结果用成了另外的一个数组中的数据,淡淡的忧桑,无尽的悲意化为我在去上课之前写会博客的动力,不废话了下面开始说LU分解。
LU分解的理论基础见此:http://zh.wikipedia.org/wiki/LU%E5%88%86%E8%A7%A3。
那么LU分解的用计算机实现的思路就比较简单了。如同上篇所说的高斯消元法,对于LU分解和高斯消元法的不同之处就在于高斯消元法对于每次消去之时的系数是不保留的,而LU分解会将把此位置消为零时所乘的系数记录下来,那么之后,对于每给出一列b我们就都可以计算其相对应的x的值。这样更适合批量操作~
同样的,要计算的话就先申请 || 释放空间吧:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
double **mat = NULL, *x = NULL, *B = NULL, **L = NULL, *Y = NULL;
int *exchange = NULL;
void applyRoom(int n){
int i = 0;
x = (double *)malloc(sizeof(double) * n);
B = (double *)malloc(sizeof(double) * n);
//Y = (double *)malloc(sizeof(double) * n);
//用下标记录当前状态下是哪一行与下面进行的交换,顺序向下,记录每次最上面的一行跟下面哪行交换
exchange = (int *)malloc(sizeof(int) * n);
mat = (double **)malloc(sizeof(double *) * n);
L = (double **)malloc(sizeof(double *) * n);
for(; i < n; i++){
mat[i] = (double *)malloc(sizeof(double) * (n));
L[i] = (double *)malloc(sizeof(double) * (n));
}
for(i = 0; i < n; i++)
L[i][i] = 1.0;
}
void freeRoom(int n){
int i = 0;
for(; i < n; i++){
free(mat[i]);
free(L[i]);
}
free(mat);
free(x);
free(B);
free(exchange);
}