PLU分解的优点是,能够将Ax=b的矩阵,转换成Ly=b, Ux = y

的形式。当我们改变系数矩阵b时,此时因为矩阵L和U均是固定

的,所以总能高效的求出矩阵的解。

// LU.cpp : Defines the entry point for the console application.
//
/************************************************
* Author: JohnsonDu
* From: Institute of Computing Technology
* University of Chinese Academy of Science
* Time: 2014-10-7
* Content: PLU decomposition
*************************************************/ #include "stdafx.h" #define MAXN 5005
#define eps 1e-9 // 精度
int n, m;
double mat[MAXN][MAXN]; // 输入矩阵
double matL[MAXN][MAXN]; // 矩阵L
double matU[MAXN][MAXN]; // 矩阵U
int matP[MAXN][MAXN]; // 矩阵P
int seq[MAXN]; // 记录行变换
//double vecB[MAXN];
//double vecY[MAXN];
//double vecX[MAXN];
//double matPb[MAXN]; void menu()
{
printf("----------------PLU Factorization---------------\n");
printf("| Please follow the instruction |\n");
printf("| to determine the LU decomposition |\n");
printf("| PA = LU |\n");
printf("------------------------------------------------\n\n"); } void initLMatrix()
{
memset(matU, 0, sizeof(matU));
memset(matL, 0, sizeof(matL));
memset(matP, 0, sizeof(matP));
} void padLMatrix()
{
for(int i = 0; i < n; i ++)
matL[i][i] = 1.0;
} inline double Abs(double x)
{
return x < 0 ? -x : x;
} void displayLU()
{
// 输出矩阵L
printf("\n----------------------\n");
printf("Matrix L follows: \n");
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < (n < m ? n : m); j ++)
printf("%.3f ", matL[i][j]);
printf("\n");
} // 输出矩阵U
printf("\nMatrix U follows: \n");
for(int i = 0; i < (n < m ? n : m); i ++)
{
for(int j = 0; j < m; j ++)
printf("%.3f ", matU[i][j]);
printf("\n");
} // 输出矩阵P
printf("\nMatrix P follows: \n");
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < n; j ++)
printf("%d ", matP[i][j]);
printf("\n");
}
printf("----------------------\n");
} /*
// 输出LU的过程及终于解
void displaySolution()
{
// 输出矩阵Pb
printf("\nMatrix Pb follows: \n");
for(int i = 0; i < n; i ++)
{
printf("%.3f\n", matPb[i]);
} // 输出向量y
printf("\nVector Y follows: \n");
for(int i = 0; i < n; i ++)
{
printf("%.3f\n", vecY[i]);
}
printf("\n"); // 输出解向量x
printf("\Vector X follows: \n");
for(int i = 0; i < n; i ++)
{
printf("%.3f\n", vecX[i]);
}
printf("\n");
}
*/ // 交换元素
inline void swap(int &a, int &b)
{
int t = a;
a = b;
b = t;
} // 高斯消元部分
void gauss()
{
int i;
int col;
int max_r; col = 0; //处理的当前列 // 从第一行開始进行消元
// k为处理的当前行
for(int k = 0; k < n && col < min(n, m); k ++, col ++)
{
// 寻找当前col列的绝对值最大值
max_r = k;
for(i = k + 1; i < n; i ++)
if(Abs(mat[i][col]) > Abs(mat[max_r][col]))
max_r = i; // 进行行交换
if(max_r != k)
{
for(int j = col; j < m; j ++)
swap(mat[k][j], mat[max_r][j]);
swap(seq[k], seq[max_r]);
for(int j = 0; j < n; j ++)
swap(matL[k][j], matL[max_r][j]);
} // 当前主元为零, 继续
if(Abs(mat[k][col]) < eps){
continue;
} // 消元部分,并获得L矩阵
for(int i = k + 1; i < n; i ++)
{ double t = mat[i][col] / mat[k][col];
matL[i][col] = t;
for(int j = col; j < m; j ++)
mat[i][j] -= t * mat[k][j];
} } // 为矩阵U进行赋值
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
matU[i][j] = mat[i][j]; // 生成矩阵P
for(int i = 0; i < n; i ++) matP[i][seq[i]] = 1.0; // 为矩阵L加入对角线元素
padLMatrix();
} /*
// 计算Pb的值
void calcPb()
{
for(int i = 0; i < n; i ++)
matPb[i] = 0.0;
//cout << "-----------" << endl;
for(int i = 0; i < n; i ++)
{
double t = 0.0;
for(int j = 0; j < n; j ++)
{
t = t + 1.0 * matP[i][j] * vecB[j];
//cout << t << endl;
//cout << matP[i][j] * vecB[j] << "---" << endl;
}
matPb[i] = t;
//cout << matPb[i] << endl;
}
} // 计算Ly = Pb, y向量
void calcY()
{
vecY[0] = matPb[0];
for(int i = 1; i < n; i ++)
{
double t = 0.0;
for(int j = 0; j < i; j ++)
t += vecY[j] * matL[i][j];
vecY[i] = matPb[i] - t;
}
} // 计算Ux = y, y向量
void calcX()
{
vecX[n-1] = vecY[n-1] / matU[n-1][n-1];
for(int i = n-2; i >= 0; i --)
{
double t = 0.0;
for(int j = n-1; j > i; j --)
t += vecX[j] * matU[i][j];
vecX[i] = (vecY[i] - t) / matU[i][i];
}
}
*/ int _tmain(int argc, _TCHAR* argv[])
{
menu();
while(true)
{
printf("Please input the matrix's dimension n & m: ");
// 输入矩阵的行n和列m
scanf("%d%d", &n, &m);
printf("Please input the matrix: \n"); // 输入矩阵
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < m; j ++)
cin >> mat[i][j];
seq[i] = i;
} // 初始化为0
initLMatrix(); // 高斯消元
gauss(); // 输出P, L, U矩阵
displayLU();
system("pause");
system("cls");
menu(); /*
//此处是输入b,求取x, y 和 pb
while(true){
printf("please input vector b(whose length equals to %d): \n", n);
for(int i = 0; i < n; i ++) cin >> vecB[i];
calcPb();
calcY();
calcX();
displaySolution();
}
*/
} return 0;
}

当中stdafx.h的头文件:

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
// #pragma once
#define _CRT_SECURE_NO_WARNINGS #include "targetver.h" #include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;

PLU Decomposition的更多相关文章

  1. Matrix QR Decomposition using OpenCV

    Matrix QR decomposition is very useful in least square fitting model. But there is no function avail ...

  2. A.Kaw矩阵代数初步学习笔记 7. LU Decomposition

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  3. URAL 1320 Graph Decomposition(并查集)

    1320. Graph Decomposition Time limit: 0.5 secondMemory limit: 64 MB There is a simple graph with an ...

  4. 奇异值分解(We Recommend a Singular Value Decomposition)

    奇异值分解(We Recommend a Singular Value Decomposition) 原文作者:David Austin原文链接: http://www.ams.org/samplin ...

  5. We Recommend a Singular Value Decomposition

    We Recommend a Singular Value Decomposition Introduction The topic of this article, the singular val ...

  6. 【转】奇异值分解(We Recommend a Singular Value Decomposition)

    文章转自:奇异值分解(We Recommend a Singular Value Decomposition) 文章写的浅显易懂,很有意思.但是没找到转载方式,所以复制了过来.一个是备忘,一个是分享给 ...

  7. 矩阵分解(rank decomposition)文章代码汇总

    矩阵分解(rank decomposition)文章代码汇总 矩阵分解(rank decomposition) 本文收集了现有矩阵分解的几乎所有算法和应用,原文链接:https://sites.goo ...

  8. 关于SVD(Singular Value Decomposition)的那些事儿

    SVD简介 SVD不仅是一个数学问题,在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层 ...

  9. [转]奇异值分解(We Recommend a Singular Value Decomposition)

    原文作者:David Austin原文链接: http://www.ams.org/samplings/feature-column/fcarc-svd译者:richardsun(孙振龙) 在这篇文章 ...

随机推荐

  1. 【转】Google Chrome浏览器调试

    作为Web开发人员,我为什么喜欢Google Chrome浏览器 [原文地址:http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.ht ...

  2. COMMENT - 定义或者改变一个对象的评注

    SYNOPSIS COMMENT ON { TABLE object_name | COLUMN table_name.column_name | AGGREGATE agg_name (agg_ty ...

  3. 反射(hasattr,getattr,delattr,setattr)

    反射(hasattr,getattr,setattr,delattr) 反射在类中的使用 反射就是通过字符串来操作类或者对象的属性 反射本质就是在使用内置函数,其中反射有四个内置函数: hasattr ...

  4. java_udp编程

    两个重要的类: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/DatagramPacket.html ht ...

  5. baidu让用户更快看到首页

    //让用户更快看到首页 if(!location.hash.match(/[^a-zA-Z0-9]wd=/)) { document.getElementById("wrapper" ...

  6. 初识Typescript及vscode环境配置

    什么是typescript?为什么要用它? typescript简称ts,是js语法的一个超级,由微软团队维护的 js特点(不足) 弱类型:js中的数据变量没有确定的类型,可以存储对象,可以存储数字, ...

  7. Mysql对象

    2.简介 2.1 存储过程 2.1.1什么是存储过程 存储过程就是一种类似函数的脚本,可以把多个sql语句组合起来,然后使用 call 存储过程名 来调用,从而执行这些SQL语句. 特点:一次编译,下 ...

  8. 微信小程序 设置计时器(setInterval)、清除计时器(clearInterval)

    1.wxml代码 <!--index.wxml--> <view class="container"> <button type='primary' ...

  9. PHP实现微信第三方登录的方法

    本文实例讲述了PHP版微信第三方实现一键登录及获取用户信息的方法.分享给大家供大家参考,具体如下: 注意,要使用微信在第三方网页登录是需要“服务号”才可以哦,所以必须到官方申请 一开始你需要进入微信公 ...

  10. 《机器学习实战》-逻辑(Logistic)回归

    目录 Logistic 回归 本章内容 回归算法 Logistic 回归的一般过程 Logistic的优缺点 基于 Logistic 回归和 Sigmoid 函数的分类 Sigmoid 函数 Logi ...