算法学习之一(二):矩阵计算——LU分解

本文介绍了矩阵计算中的LU分解,通过错误经历引入话题,详细阐述了LU分解的理论基础和计算机实现思路。重点讲解了LU分解与高斯消元法的区别,以及在实现过程中如何记录和模拟矩阵行交换,以确保计算正确性。同时提供了计算x值的两种方法,并指出在实际应用中的考虑因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好吧,继续上来吐槽。。。昨天改了一晚上,今天查了一早上。一块一块的改,一点一点的查,终于把这个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);
}


大家看到了,这次多了不少的指针,mat依然是以前的mat,它会储存原有的系数矩阵,和之后经过变形的上三角矩阵,它的功效就是LU分解中的那个U。那么L就太明显了,就是用来存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值