Cholesky分解是对称正定矩阵求逆的一种有效方法。让我们在Python和Matlab中演示该方法。
胆碱酯酶因子
任何对称的正定矩阵 可以考虑为
哪里是下三角矩阵。下三角矩阵通常称为“胆碱酯酶因子 ”. 矩阵可以解释为正定矩阵的平方根.
查找Cholesky分解的基本算法:
注:在下面的文本中,用希腊字母表示的变量表示标量值,用拉丁字母小表示的变量是列向量,而用拉丁字母大写表示的变量则是矩阵。
给定正定矩阵,它的分区如下。
的第一个元素和分别地
从第二行开始的第一列的列向量和分别地
矩阵的剩余下半部分和大小分别
已对矩阵进行分区如上所示,可以通过以下迭代过程计算Cholesky因子分解。
计算Cholesky因式分解的步骤:
步骤1:计算标量:
步骤2:计算列向量:
步骤3:计算矩阵:
步骤4:更换具有,即,
第5步:从第1步开始重复,直到第4步的矩阵大小变为.
Matlab程序(实现上述算法):
函数1:[F]=cholesky(A,选项)
函数[F]=胆汁淤积(A,选项)%求正定矩阵a的Cholesky因子的函数%作者Mathuranathanhttps://www.gaussianwaves.com%知识共享授权:CC-NC-BY-SA 3.0%A=正定矩阵%选项可以是以下“下”、“上”之一%L=A的Cholesky因子分解,使得A=LL^T%如果option='Lower',则返回Cholesky因子矩阵L%下三角形状%如果option='Upper',则返回Cholesky因子矩阵L%上三角形状%正定性测试(需要满足对称性)%检查矩阵是否对称如果~等于(A,A'),错误(“输入矩阵不对称”);结束如果是正定(A),[m,n]=尺寸(A);L=零(m,m);%初始化为全零行=1;col=1;j=1;对于i=1:m,a11=平方(A(1,1));L(行,列)=a11;如果(m~=1),%到达最后一个分区L21=A(j+1:m,1)/a11;L(行+1:结束,列)=L21;A=(A(j+1:m,j+1:m)-L21*L21');[m,n]=尺寸(A);row=行+1;col=col+1;结束结束切换nargin案例2如果strcmpi(option,'upper'),F=L';其他的如果strcmpi(option,'lower'),F=L;else错误(“无效选项”);结束结束案例1F=L;否则错误(“输入参数不足”)结束其他的错误(“给定矩阵A不是正定的”);结束结束
函数2:x=是正定(A)
函数x=正定义(A)%检查给定矩阵a是否正定的函数%作者Mathuranathanhttps://www.gaussianwaves.com%知识共享授权:CC-NC-BY-SA 3.0%如果输入矩阵是正定的,则返回x=1%如果输入矩阵不是正定的,则返回x=0[m,~]=尺寸(A);%积极确定性测试x=1;%检查积极性的标志对于i=1:msubA=A(1:i,1:i);%提取左上kxk子矩阵如果(det(subA)<=0);%检查kxk子矩阵的行列式是否为+vex=0;断裂;结束结束%用于调试%如果是x,则显示(“给定矩阵为正定”);%else显示(“给定矩阵非正定”);结束结束
样品运行:
A是随机生成的正定矩阵。要生成随机正定矩阵,请检查下面“外部链接”部分中的链接。
>>A=[3.3821,0.8784,0.3613,-2.0349;0.8784、2.0068,0.5587,0.1169;0.3613、0.5587、3.6656,0.7807;-2.0348,0.1169,0.7807,2.5397];
>>cholesky(A,‘下’)
>>cholesky(A,‘上部’)
Python(numpy)
让我们使用Python的Numpy包验证上述结果。numpy包numpy.linalg公司包含乔列斯基计算Cholesky分解的函数(返回以下三角矩阵形式)。可以按如下方式调用
>>>将numpy导入为np>>>A=[[3.3821,0.8784,0.3613,-2.0349]\[0.8784, 2.0068, 0.5587, 0.1169],\[0.3613, 0.5587, 3.6656, 0.7807],\[-2.0349, 0.1169, 0.7807, 2.5397]]>>>np.linalg.cholesky(A)>>>数组([[1.83904867,0,0. , 0. ],[ 0.47763826, 1.33366476, 0. , 0. ],[ 0.19646027, 0.34856065, 1.87230041, 0. ],[-1.106496 , 0.48393333, 0.44298574, 0.94071184]])
评价这篇文章:(10平均票数:4.30共5个)
相关主题
作者的书籍