分解

实际问题中,当求解方程组的系数矩阵是对称矩阵时,则用下面介绍的分解法可以简化程序设计并减少计算量。

从定理可知,当矩阵A的各阶顺序主子式不为零时,A有唯一的Doolittle分解A= LU。矩阵U的对角线元素Uii 不等于0,将矩阵U的每行依次提出,

下面将U分解为

定理:若对称矩阵A的各阶顺序主子式不为零时,则A可以唯一分解为A= ,这里

L^T为L的转置矩阵。

当A有分解时,利用矩阵运算法则及相等原理易得计算ljk和dk的公式为

将对称正定矩阵通过分解成,其中是单位下三角矩阵,是对角均为正数的对角矩阵。把这

一分解叫做分解,是Cholesky分解的变形。对应两边的元素,很容易得到

由此可以确定计算的公式如下

在实际计算时,是将的严格下三角元素存储在的对应位置上,而将的对角元存储在的对应的对角位置上。

类似地求解线性方程组的解步骤如下

(1)对矩阵进行分解得到

(2)求解,得到

(3)求解,得到

代码:

[cpp] view plain copy
  1. #include <iostream>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <vector>
  5. #include <math.h>
  6. using namespace std;
  7. const int N = 1005;
  8. typedef double Type;
  9. Type A[N][N], L[N][N], D[N][N];
  10. /** 分解A得到A = LDL^T */
  11. void Cholesky(Type A[][N], Type L[][N], Type D[][N], int n)
  12. {
  13. for(int k = 0; k < n; k++)
  14. {
  15. for(int i = 0; i < k; i++)
  16. A[k][k] -= A[i][i] * A[k][i] * A[k][i];
  17. for(int j = k + 1; j < n; j++)
  18. {
  19. for(int i = 0; i < k; i++)
  20. A[j][k] -= A[j][i] * A[i][i] * A[k][i];
  21. A[j][k] /= A[k][k];
  22. }
  23. }
  24. memset(L, 0, sizeof(L));
  25. memset(D, 0, sizeof(D));
  26. for(int i = 0; i < n; i++)
  27. {
  28. D[i][i] = A[i][i];
  29. L[i][i] = 1;
  30. }
  31. for(int i = 0; i < n; i++)
  32. {
  33. for(int j = 0; j < i; j++)
  34. L[i][j] = A[i][j];
  35. }
  36. }
  37. void Transposition(Type L[][N], int n)
  38. {
  39. for(int i = 0; i < n; i++)
  40. {
  41. for(int j = 0; j < i; j++)
  42. swap(L[i][j], L[j][i]);
  43. }
  44. }
  45. void Multi(Type A[][N], Type B[][N], int n)
  46. {
  47. Type **C = new Type*[n];
  48. for(int i = 0; i < n; i++)
  49. C[i] = new Type[n];
  50. for(int i = 0; i < n; i++)
  51. {
  52. for(int j = 0; j < n; j++)
  53. {
  54. C[i][j] = 0;
  55. for(int k = 0; k < n; k++)
  56. C[i][j] += A[i][k] * B[k][j];
  57. }
  58. }
  59. for(int i = 0; i < n; i++)
  60. {
  61. for(int j = 0; j < n; j++)
  62. B[i][j] = C[i][j];
  63. }
  64. for(int i = 0; i < n; i++)
  65. {
  66. delete[] C[i];
  67. C[i] = NULL;
  68. }
  69. delete C;
  70. C = NULL;
  71. }
  72. /** 回带过程 */
  73. vector<Type> Solve(Type L[][N], Type D[][N], vector<Type> X, int n)
  74. {
  75. /** LY = B  => Y */
  76. for(int k = 0; k < n; k++)
  77. {
  78. for(int i = 0; i < k; i++)
  79. X[k] -= X[i] * L[k][i];
  80. X[k] /= L[k][k];
  81. }
  82. /** DL^TX = Y => X */
  83. Transposition(L, n);
  84. Multi(D, L, n);
  85. for(int k = n - 1; k >= 0; k--)
  86. {
  87. for(int i = k + 1; i < n; i++)
  88. X[k] -= X[i] * L[k][i];
  89. X[k] /= L[k][k];
  90. }
  91. return X;
  92. }
  93. void Print(Type L[][N], Type D[][N], const vector<Type> B, int n)
  94. {
  95. for(int i = 0; i < n; i++)
  96. {
  97. for(int j = 0; j < n; j++)
  98. cout<<L[i][j]<<" ";
  99. cout<<endl;
  100. }
  101. cout<<endl;
  102. vector<Type> X = Solve(L, D, B, n);
  103. vector<Type>::iterator it;
  104. for(it = X.begin(); it != X.end(); it++)
  105. cout<<*it<<" ";
  106. cout<<endl;
  107. }
  108. int main()
  109. {
  110. int n;
  111. cin>>n;
  112. memset(L, 0, sizeof(L));
  113. for(int i = 0; i < n; i++)
  114. {
  115. for(int j = 0; j < n; j++)
  116. cin>>A[i][j];
  117. }
  118. vector<Type> B;
  119. for(int i = 0; i < n; i++)
  120. {
  121. Type y;
  122. cin>>y;
  123. B.push_back(y);
  124. }
  125. Cholesky(A, L, D, n);
  126. Print(L, D, B, n);
  127. return 0;
  128. }
  129. /**data**
  130. 4
  131. 4 -2 4 2
  132. -2 10 -2 -7
  133. 4 -2 8 4
  134. 2 -7 4 7
  135. 8 2 16 6
  136. */

参考资料:http://class.htu.cn/nla/cha1/sect3.htm


转自:http://blog.csdn.net/acdreamers/article/details/44656847

http://blog.csdn.net/zhouliyang1990/article/details/21952485

矩阵分解 LDL^T分解相关推荐

  1. 解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解

    文章目录 1. 前言 2. LU三角分解 3. Cholesky分解 - LDLT分解 4. Cholesky分解 - LLT分解 5. QR分解 6. 奇异值分解 7. 特征值分解 1. 前言 本博 ...

  2. 视觉SLAM中的数学——解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解

    前言 本博客主要介绍在SLAM问题中常常出现的一些线性代数相关的知识,重点是如何采用矩阵分解的方法,求解线性方程组AX=B.主要参考了<计算机视觉--算法与应用>附录A以及Eigen库的方 ...

  3. 三阶矩阵的lu分解详细步骤_数学 - 线性代数导论 - #4 矩阵分解之LU分解的意义、步骤和成立条件...

    线性代数导论 - #4 矩阵分解之LU分解的意义.步骤和成立条件 目前我们用于解线性方程组的方法依然是Gauss消元法.在Gauss消元法中,我们将右侧向量b与A写在一起作为一个增广矩阵进行同步的操作 ...

  4. 7.4.3 矩阵极分解和平方根分解

    7.4.3 矩阵极分解和平方根分解 当矩阵 AAA 是方阵时 A=UΣVT=UVTVΣVT=(UVT)(VΣVT)=QSQ=UVT是正交矩阵,S=VΣVT是对称半正定矩阵,即对任意向量x,有xTSx≥ ...

  5. 机器学习(十一)——机器学习中的矩阵方法(1)LU分解、QR分解

    http://antkillerfarm.github.io/ 因子分析的EM估计(续) 去掉和各参数无关的部分后,可得: ∑i=1mE[logp(x(i)|z(i);μ,Λ,Ψ)]=∑i=1mE[1 ...

  6. 将投影矩阵P利用QR分解分解出摄像机内外参数(Opencv)

    将投影矩阵P利用QR分解分解出摄像机内外参数(Opencv) /***************************************************************     ...

  7. 几种矩阵分解算法: LU分解,Cholesky分解,QR分解,SVD分解,Jordan分解

    目录 1.LU分解 2. LDLT分解法 3. Cholesky分解的形式 4. QR分解 5.SVD分解 5.1 SVD与广义逆矩阵 6. Jordan 分解 参考文章: ---------我只是搬 ...

  8. 矩阵的LU分解,LU分解的推广,LU分解有什么意义,为什么要用LU分解。

    一点点数学!开干! 参考书籍:<矩阵分析与计算>李继根 张新发编著 矩阵的LU分解: LU分解定理:如果n阶方阵A的各阶顺序主子式≠0(K=1.2.3,-,n),即A的各阶顺序主子式矩阵都 ...

  9. 矩阵的三角分解(LU分解)

    矩阵的三角分解将矩阵分解成一个下三角矩阵L和一个上三角矩阵U的乘积. 定义:如果n阶矩阵A能够分解成一个下三角矩阵L和一个上三角矩阵U的乘积,则称这种分解为三角分解或LU分解,如果n阶矩阵A能够分解为 ...

最新文章

  1. 链表问题11——两个单链表相交的系列问题(一):找到有环链表的环入口节点
  2. 【AIX 命令学习】加载与卸载文件系统!
  3. 【数字信号处理】序列傅里叶变换 ( 狄义赫利条件 | 序列傅里叶变换定义 )
  4. HTML中通过CSS方式隐藏元素
  5. Drools学习 入门实例
  6. sql中索引不会被用到的几种情况
  7. Kafka核心源码解析 - KafkaController源码解析
  8. h5页面调用相机功能
  9. Sudo bug 可导致非权限 Linux 和 MacOS 用户以根身份运行命令
  10. VIM之taglist
  11. Java设计模式之观察者模式(发布-订阅模式)
  12. 《unity2021》如何改成中文
  13. easyui图标对照
  14. 基于Android的健康打卡系统,基于Android平台的个人健康管理系统
  15. 服务器数据恢复的两种方法
  16. ietester测试本地html,网站浏览器兼容测试软件–IETester
  17. 计算机本地网络给手机使用吗,手机网络也能共享给电脑(台式or笔记本)使用吗?...
  18. VB完全控制IE浏览器,操作ie对象,响应ie事件
  19. 基金从业考试一般要准备多长时间?
  20. kinhdown稳定版无法连接服务器,KinhDown稳定版

热门文章

  1. 浅析西方反风电风潮与我国风电建设
  2. android 给界面加指定的字体
  3. [乐意黎]Windows 里的环境变量以及%USERPROFILE%等变量设置
  4. h5移动端配合微信sdk常用的9个工具函数
  5. c语言集合交并补 位运算实现
  6. 京东英特尔联手布局企业级市场,引领中小企业PC采购新趋势
  7. PE格式:手工实现各种脱壳后的修复
  8. 找不到答案的时候,就独自出去看一看这个世界
  9. 嘻哈说:设计模式之迪米特法则
  10. 剖析根据汉字转拼音的JQuery插件源码