文章目录
步骤一:读数据
步骤一:读数据
X = xlsread('blind date.xlsx'); % 读取Excel文件中的相亲数据
详细说明:
该命令会自动读取Excel文件"blind date.xlsx"中的所有数值数据
读取的数据会存储在矩阵变量X中
如果Excel文件中包含多个工作表,默认读取第一个工作表的数据
可以指定特定工作表读取,例如:xlsread('blind date.xlsx','Sheet2')
该函数会忽略Excel文件中的文本和格式,只读取数值数据
步骤二:指标正向化
- 三类指标转换为极大型
-
极小型:数值越小越好
-
极小型转极大型
X(:,vec(i)) = Min2Max(X(:,vec(i))); %极小型转为极大型
\[极小MinMax讲解\]
-
中间型:越接近某个值越好
-
中间型转极大型
best = input('请输入中间型的最好值:\n');%用户需要最好的数值 temp = X(:,vec(i)); X(:,vec(i)) = Mid2Max(X(:,vec(i)), best);
\[中间MidMax讲解\]
-
区间型:落在某个区间越好
-
区间型转最大型
1. arr = input('请输入最佳区间,按照"[a,b]"的形式输入:\n');
X(:,vec(i)) = Int2Max(X(:,vec(i)), arr(1), arr(2));
\[区间Int2Max\]
输入:[[正向化输入]]
步骤三:数据标准化
-
获取规模
disp('***************正在进行标准化...***************');
[n,m] = size(X);
-
\[检查负数元素\]
bash
% 检查有没有负数元素
isNeg = 0;
for i = 1 : n
for j = 1 : m
if(X(i,j) < 0)
isNeg = 1;
break;
end
end
end
if (isNeg == 0)%没有负数
squere_X = (X.*X);
sum_X = sum(squere_X,1).^0.5; %按列求和,再开方
stand_X = X./repmat(sum_X, n, 1);
else
max_X = max(X,[],1); %按照列找出最大元素
min_X = min(X,[],1); %按照列找出最小元素
stand_X = X - repmat(min_X,n,1) ./ (repmat(max_X,n,1) - repmat(min_X,n,1));
end
disp('标准化完成!')
步骤三:数据标准化

步骤四:结果处理
- 确定虚拟供应商
- 最大虚拟供应商置于最后一列
- 使用zeros(m,n-1)创建m行n-1列的0矩阵
-
将结果归一化
res_topsis = S ./ sum(S)
%xlswrite('res_topsis.xlsx',res_topsis) %写入excel文档
%disp('已完成打分,请到当前目录下res_topsis.xlsx文件中取出结果!')