Cholesky正定矩阵分解附matlab代码

简介: Cholesky正定矩阵分解附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

本文介绍了矩阵的Cholesky分解算法,结合实例用Matiab编程实现了矩阵的Cholesky分解.

⛄ 完整代码

clc;

clear all;


Cx3=[1.0 0.5;

    0.5 1.0];

Cx1=[1.0 0.5 0.8 0.7 0.6;

    0.5 1.0 0.7 0.6 0.8;

    0.8 0.7 1.0 0.5 0.6;

    0.7 0.6 0.5 1.0 0.9;

    0.6 0.8 0.6 0.9 1.0];

Cx2=[1.0 0.5 0.8 0.7 0.6 0.4;

    0.5 1.0 0.7 0.6 0.8 0.5;

    0.8 0.7 1.0 0.5 0.6 0.5;

    0.7 0.6 0.5 1.0 0.9 0.6;

    0.6 0.8 0.6 0.9 1.0 0.6;

    0.4 0.5 0.5 0.6 0.6 1.0];

%正定矩阵的Cholesky分解

[m,n]=size(Cx1);

if m~=n  %判断输入的矩阵是不是方阵

   disp('输入的矩阵不是方阵,请重新输入');

   return;

end

for i=1:n  %判断输入的矩阵是不是对称矩阵

   for j=1:n

       if Cx1(i,j)~=Cx1(j,i)

           disp('输入的方阵不是对称矩阵,请重新输入');

           return;

       end

   end

end

d=eig(Cx1); %根据方阵的特征值判定是不是正定矩阵

for i=1:n

   if d(i)==0

       disp('输入的矩阵不是正定矩阵,请重新输入');

       return;

   else

       break;

   end

end

disp('输入的矩阵可以进行Cholesky分解'); %如果是正定矩阵,可以进行下面的分解操作

R1=chol(Cx1,'lower');


randn('state', sum(100*clock));

%利用时钟设置随机种子,这样每次产生的随机数就不同了

N=1000;

% 设置样本个数

W1=zeros(5,N);

WW1=zeros(5,N);

for i=1:N

   W1(:,i)=randn(5,1);

end

WW1(1,:)=W1(1,:).*0.45+4.5;

WW1(2,:)=W1(2,:).*0.63+3.7;

WW1(3,:)=W1(3,:).*0.58+5.3;

WW1(4,:)=W1(4,:).*0.51+4.9;    

WW1(5,:)=W1(5,:).*0.56+4.2;  

Z1=R1*W1;

rouMW1=corrcoef(W1');

rouMZ1=corrcoef(Z1');


Ls1=zeros(5,N);

for p=1:5

   maxZ1=max(Z1(p,:));

   k=1;

   for q=1:N

       [minZ locZ]=min(Z1(p,:));

       Ls1(p,locZ)=k;

       k=k+1;

       Z1(p,locZ)=maxZ1+1;

   end

end

LLs1=Ls1;


x1=zeros(5,N);

for i=1:N

   sx1=(i-0.5)/N;

   x1(1,i)=norminv(sx1,4.5,0.45);

   x1(2,i)=norminv(sx1,3.7,0.63);

   x1(3,i)=norminv(sx1,5.3,0.58);

   x1(4,i)=norminv(sx1,4.9,0.51);

   x1(5,i)=norminv(sx1,4.2,0.56);    

end


S1=zeros(5,N);

for i=1:5

   tx1=x1(i,:);

   tLs1=LLs1(i,:);

   maxy1=max(tx1);

   maxtLs1=max(tLs1);

   for p=1:N

       [C1 D1]=min(tx1);

       [C2 D2]=min(LLs1(i,:));

       tLs1(1,D2)=C1;

       tx1(1,D1)=maxy1+1;

       LLs1(i,D2)=maxtLs1+1;

   end

   S1(i,:)=tLs1;

end

rouMS1=corrcoef(S1');



%正定矩阵的Cholesky分解

[m,n]=size(Cx2);

if m~=n  %判断输入的矩阵是不是方阵

   disp('输入的矩阵不是方阵,请重新输入');

   return;

end

for i=1:n  %判断输入的矩阵是不是对称矩阵

   for j=1:n

       if Cx2(i,j)~=Cx2(j,i)

           disp('输入的方阵不是对称矩阵,请重新输入');

           return;

       end

   end

end

d2=eig(Cx2); %根据方阵的特征值判定是不是正定矩阵

for i=1:n

   if d2(i)==0

       disp('输入的矩阵不是正定矩阵,请重新输入');

       return;

   else

       break;

   end

end

disp('输入的矩阵可以进行Cholesky分解'); %如果是正定矩阵,可以进行下面的分解操作

R2=chol(Cx2,'lower');


randn('state', sum(100*clock));

%利用时钟设置随机种子,这样每次产生的随机数就不同了

% 设置样本个数

W2=zeros(6,N);

WW2=zeros(6,N);

for i=1:N

   W2(:,i)=randn(6,1);

end

   WW2(1,:)=W2(1,:).*0.45+4.5;

   WW2(2,:)=W2(2,:).*0.63+3.7;

   WW2(3,:)=W2(3,:).*0.58+5.3;

   WW2(4,:)=W2(4,:).*0.51+4.9;    

   WW2(5,:)=W2(5,:).*0.56+4.2;

   WW2(6,:)=W2(6,:).*0.47+4.7;

Z2=R2*W2;

rouMW2=corrcoef(W2');

rouMZ2=corrcoef(Z2');


Ls2=zeros(6,N);

for p=1:6

   hig=max(Z2(p,:));

   k=1;

   for i=1:N

       [b c]=min(Z2(p,:));

        Ls2(p,c)=k;

       k=k+1;

       Z2(p,c)=hig+1;

   end

end

LLs2=Ls2;


x2=zeros(6,N);

for i=1:N

   tt=(i-0.5)/N;

   x2(1,i)=norminv(tt,4.5,0.45);

   x2(2,i)=norminv(tt,3.7,0.63);

   x2(3,i)=norminv(tt,5.3,0.58);

   x2(4,i)=norminv(tt,4.9,0.51);

   x2(5,i)=norminv(tt,4.2,0.56);  

   x2(6,i)=norminv(tt,4.7,0.47);

end



for i=1:6

   y2=x2(i,:);

   bb2=LLs2(i,:);

   hig1=max(y2);

   hig2=max(bb2);

   for p=1:N

       [C1 D1]=min(y2);

       [C2 D2]=min(LLs2(i,:));

      bb2(1,D2)=C1;

   y2(1,D1)=hig1+1;

      LLs2(i,D2)=hig2+1;

end

yy2(i,:)=bb2;

end


ccc22=corrcoef(yy2');


%for i=1:6

%[f,xi]=ksdensity(yy2(i,:));

%绘制图形

%figure(i);

%subplot(2,1,1);

%plot(yy(i,:));

%title('样本数据(Sample Data)')

%subplot(2,1,2);

%plot(xi,f);

%title('概率密度分布(PDF)')

%end



%正定矩阵的Cholesky分解

[m,n]=size(Cx3);

if m~=n  %判断输入的矩阵是不是方阵

   disp('输入的矩阵不是方阵,请重新输入');

   return;

end

for i=1:n  %判断输入的矩阵是不是对称矩阵

   for j=1:n

       if Cx3(i,j)~=Cx3(j,i)

           disp('输入的方阵不是对称矩阵,请重新输入');

           return;

       end

   end

end

d3=eig(Cx3); %根据方阵的特征值判定是不是正定矩阵

for i=1:n

   if d(i)==0

       disp('输入的矩阵不是正定矩阵,请重新输入');

       return;

   else

       break;

   end

end

disp('输入的矩阵可以进行Cholesky分解'); %如果是正定矩阵,可以进行下面的分解操作

R3=chol(Cx3,'lower');


randn('state', sum(100*clock));

%利用时钟设置随机种子,这样每次产生的随机数就不同了

% 设置样本个数

W3=zeros(2,N);

WW3=zeros(2,N);

for i=1:N

   W3(:,i)=randn(2,1);

end

for i=1:N

   WW3(:,i)=wblrnd(9.0,2.15,2,1);

end



Z3=R3*W3;

ccc03=corrcoef(W3');

ccc03

ccc13=corrcoef(Z3');

ccc13


aa3=zeros(2,N);

Ls3=zeros(2,N);

for p=1:2

hig=max(Z3(p,:));

k=1;

for i=1:N

[b c]=min(Z3(p,:));

Ls3(p,c)=k;

k=k+1;

Z3(p,c)=hig+1;

end

end

LLs3=Ls3;


x=zeros(2,N);

for i=1:N

   tt=(i-0.5)/N;

   x3(1,i)=wblinv(tt,9.0,2.15);

   x3(2,i)=wblinv(tt,9.0,2.15);  

end



for i=1:2

y3=x3(i,:);

bb3=LLs3(i,:);

hig1=max(y3);

hig2=max(bb3);


for p=1:N

[C1 D1]=min(y3);

[C2 D2]=min(LLs3(i,:));

bb3(1,D2)=C1;

y3(1,D1)=hig1+1;

LLs3(i,D2)=hig2+1;

end

yy3(i,:)=bb3;

end


ccc23=corrcoef(yy3');

ccc23


YY=[S1;yy2;yy3];

YY

ccc3=corrcoef(YY');

ccc3

for i=1:N

F(1,i)=(S1(1,i)+S1(2,i)+S1(3,i)+S1(4,i)+S1(5,i))+(yy2(1,i)+yy2(2,i)+yy2(3,i)+yy2(4,i)+yy2(5,i)+yy2(6,i))+(yy3(1,i)+yy3(2,i));

FF(1,i)=(WW1(1,i)+WW1(2,i)+WW1(3,i)+WW1(4,i)+WW1(5,i))+(WW2(1,i)+WW2(2,i)+WW2(3,i)+WW2(4,i)+WW2(5,i)+WW2(6,i))+(WW3(1,i)+WW3(2,i));

end

minF=min(F);

maxF=max(F);

del=(maxF-minF)/5;

pp=linspace(minF-del,maxF+del,100) ;

[f1,xi1]=ksdensity(F,pp,'function','pdf');

[f2,xi2]=ksdensity(FF,pp,'function','pdf');

figure(1);

plot(xi1,f1,'r');

hold on

plot(xi2,f2,'b');

title('概率密度分布(PDF)')



pp=linspace(minF-del,maxF+del,100) ;

[f11,xi11]=ksdensity(F,pp,'function','cdf');

[f22,xi22]=ksdensity(FF,pp,'function','cdf');

figure(2);

plot(xi11,f11,'r');

hold on

plot(xi22,f22,'b');

title('累积概率分布')

⛄ 运行结果

⛄ 参考文献

[1]杨蕊. 矩阵的Cholesky分解的Matlab实现[J]. 中国科技信息, 2007(4):2.

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料


相关文章
|
4月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
217 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
4月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
139 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
4月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
105 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
7月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
7月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
|
7月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于DCT变换和位平面分解的数字水印嵌入提取算法matlab仿真
这是一个关于数字水印算法的摘要:使用MATLAB2022a实现,结合DCT和位平面分解技术。算法先通过DCT变换将图像转至频域,随后利用位平面分解嵌入水印,确保在图像处理后仍能提取。核心程序包括水印嵌入和提取,以及性能分析部分,通过PSNR和NC指标评估水印在不同噪声条件下的鲁棒性。
|
7月前
|
数据安全/隐私保护
地震波功率谱密度函数、功率谱密度曲线,反应谱转功率谱,matlab代码
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
7月前
|
算法 调度
面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)
面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)
|
7月前
|
运维 算法
基于改进遗传算法的配电网故障定位(matlab代码)
基于改进遗传算法的配电网故障定位(matlab代码)