进行权重计算之前要先对判断矩阵进行一致性检验
权重的计算有三种方法:
①算数平均法求权重
②几何平均法求权重
③特征值法求权重
一、一致性检验
二、权重计算
1.算数平均法求权重
①将矩阵按列归一化(每一列加起来等于1)
②将归一化后的矩阵按行相加(每一行的数据相加)
③得到的列向量除以矩阵的阶数n
代码如下(示例):
% 第一步将矩阵按列归一化
ret = sum(A); % 对列求和
A_arith = A./ret;
% 第二步将行求和
A_arith = sum(A_arith, 2);
% 第三步除以n
A_arith = A_arith/row;
2.几何平均法求权重
①矩阵按行相乘(一行上的元素相乘)
②列向量的每个元素开n次方
③得到的新列向量归一化
代码如下(示例):
% 第一步按行相乘
A_geo = prod(A, 2); % 按行求积
% 第二步将每个元素开n次方
A_geo = A_geo.^(1/row);
% 将列向量归一化
A_geo = A_geo/sum(A_geo);
3.特征值法求权重
①求出最大特征值对应的特征向量
②最大值对应的特征向量归一化
代码如下(示例):
% 求最大的特征值对应的特征向量
[a, b] = eig(A); % a是特征向量 b是特征值构成的对角矩阵
max_eig = max(max(b)); % 求最大的特征值
[r, c] = find(b == max_eig); % a == max_eig变成逻辑矩阵,a中元素等于max_eig就变为1,不等就变为0。find查找到1的坐标
A_eig = a(:, c); % 取出最大特征值对应的特征向量
% 归一化
A_eig = A_eig/sum(A_eig);
总结
由于一致性判断需要求特征值,所以可以先算权重再进行一致性检验(论文里不能这么写),总代码如下
判断是否为方阵、正互反矩阵、非一致性矩阵
clear;clc
A = input("请输入矩阵A的值: ");
[row, col] = size(A);
% 判断是否为方阵
Error = 0;
if row ~= col % 行数和列数不等
Error = 1;
end
% 判断是否为正互反矩阵(对称矩阵)
if A'.*A ~= ones(row) & Error == 0 % A和A转置的元素相乘
Error = 2;
end
% 判断是否为一致矩阵
if rank(A) == 1 & Error == 0 % 一致矩阵的秩为1
Error = 3;
end
算数平均法求权重
% 第一步将矩阵按列归一化
ret = sum(A); % 对列求和
A_arith = A./ret;
% 第二步将行求和
A_arith = sum(A_arith, 2);
% 第三步除以n
A_arith = A_arith/row;
几何平均法求权重
% 第一步按行相乘
A_geo = prod(A, 2); % 按行求积
% 第二步将每个元素开n次方
A_geo = A_geo.^(1/row);
% 将列向量归一化
A_geo = A_geo/sum(A_geo);
特征值法求权重
% 求最大的特征值对应的特征向量
[a, b] = eig(A); % a是特征向量 b是特征值构成的对角矩阵
max_eig = max(max(b)); % 求最大的特征值
[r, c] = find(b == max_eig); % a == ret变成逻辑矩阵,find查找到1的坐标
A_eig = a(:, c);
% 归一化
A_eig = A_eig/sum(A_eig);
进行一致性判断
CI = (max_eig-row)/(row-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]; % 第二个变为0.001是因为
CR = CI/RI(row);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR < 0.1
disp("矩阵的一致性可以接受")
disp("算数平均法求得的权重为: ")
disp(A_geo)
disp("几何平均法求得的权重为: ")
disp(A_geo)
disp("特征值法求得的权重为:")
disp(A_eig)
else
disp("矩阵一致性检验不合格")
if Error == 1
disp("矩阵不是方阵")
elseif Error == 2
disp("矩阵不是正互反矩阵")
elseif Error == 3
disp("矩阵是一致性矩阵")
end
end