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电子书和数学建模资料


相关文章
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
213 0
|
2月前
|
算法 定位技术 计算机视觉
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
114 0
|
2月前
|
算法 机器人 计算机视觉
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
|
2月前
|
新能源 Java Go
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
109 0
|
2月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
147 8
|
2月前
|
机器学习/深度学习 编解码 算法
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
144 8
|
2月前
|
机器学习/深度学习 数据采集 测试技术
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
|
2月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
159 8
|
2月前
|
机器学习/深度学习 供应链 算法
【电动车】基于削峰填谷的电动汽车多目标优化调度策略研究(Matlab代码实现)
【电动车】基于削峰填谷的电动汽车多目标优化调度策略研究(Matlab代码实现)
|
2月前
|
传感器 机器学习/深度学习 算法
【无人机协同】动态环境下多无人机系统的协同路径规划与防撞研究(Matlab代码实现)
【无人机协同】动态环境下多无人机系统的协同路径规划与防撞研究(Matlab代码实现)
164 0

热门文章

最新文章