一些简单的算法MATLAB代码
- 格式:doc
- 大小:38.50 KB
- 文档页数:5
层次分析法:
%层次分析法的matlab程序
disp('请输入判断矩阵A(n阶)');
A=input('A=');%判断矩阵
[n,n]=size(A);%n阶
x=ones(n,100);
y=ones(n,100);
m=zeros(1,100);
m(1)=max(x(:,1));
y(:,1)=x(:,1);
x(:,2)=A*y(:,1);
m(2)=max(x(:,2));
y(:,2)=x(:,2)/m(2);
p=0.0001;i=2;k=abs(m(2)-m(1));
while k>p
i=i+1;
x(:,i)=A*y(:,i-1);
m(i)=max(x(:,i));
y(:,i)=x(:,i)/m(i);
k=abs(m(i)-m(i-1));
end
a=sum(y(:,i));
w=y(:,i)/a;
t=m(i);
disp('权向量');disp(w);
disp('最大特征值');disp(t);
%以下是一致性检验
CI=(t-n)/(n-1);RI=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59];%RI根据n来选
CR=CI/RI(n);%判断是否通过一致性检验
if CR<0.10
disp('此矩阵的一致性可以接受!');
disp('CI=');disp(CI);
disp('CR=');disp(CR);
else
disp('此矩阵的一致性不可以接受!');
end
主成分分析:
function [lambda,T,fai]=MSA2(A)%lambda特征根,T特征向量,fai贡献率
%求标准化后的协差矩阵,再求特征根和特征向量
%标准化处理
[p,n]=size(A);%p行n列,列为几种
for j=1:n
mju(j)=mean(A(:,j));
sigma(j)=sqrt(cov(A(:,j)));
end
for i=1:p
for j=1:n
Y(i,j)=(A(i,j)-mju(j))/sigma(j);
end
end
sigmaY=cov(Y);
%求X标准化的协差矩阵的特征根和特征向量
[T,lambda]=eig(sigmaY);
disp('特征根(由小到大):');
disp(lambda);
disp('特征向量:');
disp(T);
%方差贡献率;
Xsum=sum(sum(lambda,2),1);
for i=1:n
fai(i)=lambda(i,i)/Xsum;
end
disp('方差贡献率:');
disp(fai);
u=T(:,n);
B=[];
h=length(A(:,1));
for k=1:n
m1=mean(A(:,k));
t=(A(:,k)-m1).^2;
m2=sqrt(sum(t))/(h-1);
B=[B,(A(:,k)-m1)./m2];
end
y=B*u;
x1=1:1:length(y);
plot(x1,y);
xlabel('时间/小时')
ylabel('综合指标') title('综合指标-时间曲线')
灰色关联度:
clear all;
close all;
clc
x(1,:)=[1039641,1114569,1146388,1265890,1322341,1482145,1548594,1634719,1798300,1905093,2084144,2367708,2551127];
x(2,:)=[7093233,7935809,9018225,10757812,13182254,14943581,17283905,20458811,23725807,23871200,28440693,33237887,35726276];
x(3,:)=[5692742,6629760,7653689,8974042,10927201,13012704,15602473,18946588,22365641,25099237,28966850,34584984,39742655];%比较序列
m=3;%几行
n=13;%几列
x0=[2143000,2497000,2944000,3259000,4101000,4651000,5437000,6301000,7072000,8031000,10257000,11910000,13923000]%参考序列
avg=zeros(1,n);
for i=1:m
for j=1:n
avg(j)=avg(j)+x(i,j);%均值序列
end
end
for i=1:n
x0(i)=x0(i)/avg(i);%参考序列均值化
end
for j=1:m
for i=1:n
delta(j,i)=abs(x(j,i)-x0(i));%求序列差
end
end
max=delta(1,1);
for j=1:m
for i=1:n
if delta(j,i);
max=delta(j,i);%求两级差
end
end
end
min=0;
for j=1:m
xgd(j)=0;
for i=1:n glxs(j,i)=0.5*max/(0.5*max+delta(j,i));%关联系数与相关度
xgd(j)=xgd(j)+glxs(j,i);
end
xgd(j)=xgd(j)/n;
end
disp('关联系数:');disp(glxs);
disp('相关度');disp(xgd);
Floyd算法
function [D,R]=floyd(A)
%用floyd算法实现求任意两点之间的最短路程。可以有负权
%参数D为连通图的权矩阵
D=A;n=length(D);
for i=1:n
for j=1:n
R(i,j)=i;%赋路径初值
end
end
for k=1:n
for i=1:n
for j=1:n
if D(i,k)+D(k,j) D(i,j)=D(i,k)+D(k,j);%更新 D(i,j),说明通过k的路程更短 R(i,j)=R(k,j);%更新R(i,j),需要通过k end end end hl=0; for i=1:n if D(i,i)<0 hl=1; break;%跳出内层的for循环 end end if(hl==1) fprintf('有负回路') break;%跳出最外层循环 end end disp('最短距离矩阵');disp(R); disp('连通图权矩阵');disp(D);