topsis代码matlab可直接用

%%运行部分
clear;clc
%第一步导入数据
load data_water_quality.mat%%首先要自己导入并且命名数据

%%  第二步,对数据进行正向化判断
[n,m] = size(X);%获得数据的行数和列数
disp(['一共有' num2str(n) '个评价的对象, ' num2str(m) '个评价的指标']) %%num2str(n)将数值字符化
juDge= input(['这' num2str(m) '个评价指标是否需要进行正向化处理,如果需要请输入1 ,不需要输入0:  ']);

if juDge== 1
    poSiTion = input('请输入需要正向化处理的评价指标所在的列的位置,例如第1、5、6三列需要处理,那么你需要输入[1,5,6]: '); 
    disp('请输入列需要进行处理的指标类型(1:极小型, 2:中间型, 3:区间型) ')
    Type = input('例如:第1列是极小型,第5列是区间型,第6列是中间型,就输入[1,3,2]:  ')
    % %注意,poSiTion和Type维度度相同,且均是行向量
    for i = 1 : size(poSiTion,2)  %了解循环的次数,即对列处理的次数
        X(:,poSiTion(i)) = Positivization(X(:,poSiTion(i)),Type(i),poSiTion(i));
    % Positivization是我们自己定义的函数,其作用是进行正向化,其一共接收三个参数
    
    end
    disp('正向化后的矩阵 X =  ')%%输出正向化后的矩阵,第二步完成
    disp(X)
end

%% %第三步:进行标准化
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);%%重复块
disp('标准化后的矩阵 Z = ')
disp(Z)%输出标准化后的矩阵。

%% 第四步:分别计算出与最大值的距离和最小值的距离,并且算出最后的得分
Djia = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5;   %计算 D+
Djian= sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5;   % 计算 D- 
S = Djian./ (Djia+Djian);    % 求得未归一化的得分
disp('最后的得分为:')%%接下来输出最后的得分
stand_S = S / sum(S)%%归一化后的得分
[sorted_S,index] = sort(stand_S ,'descend')

函数编写


函数1
%%极小型指标正向化函数
function [posit_x] = Min2Max(x)
    posit_x = max(x) - x;
     %posit_x = 1 ./ x;    %如果x全部都大于0,也可以这样正向化
end

函数2
%%中间型指标正向化函数
function [posit_x] = Mid2Max(x,best)
    M = max(abs(x-best));
    posit_x = 1 - abs(x-best) / M;
end
函数3
%%区间型指标正向化函数
function [posit_x] = Inter2Max(x,a,b)
    r_x = size(x,1);  % row of x 
    M = max([a-min(x),max(x)-b]);
    posit_x = zeros(r_x,1);   %zeros函数用法: zeros(3)  zeros(3,1)  ones(3)
    % 初始化posit_x全为0  初始化的目的是节省处理时间
    for i = 1: r_x
        if x(i) < a
           posit_x(i) = 1-(a-x(i))/M;
        elseif x(i) > b
           posit_x(i) = 1-(x(i)-b)/M;
        else
           posit_x(i) = 1;
        end
    end
end
%%正向化集合处理函数
function [posit_x] = Positivization(x,type,i)
% 要输入三个变量:
% x:需要正向化处理的评价指标所对应的原始列向量
% type: 指标的三种类型(1:"极小型", 2:"中间型", 3:"区间型")
% i: 正在处理中的原始矩阵中的列
% 输出的变量posit_x表示:正向化后的列向量。
    if type == 1  %判断是否为极小型的指标
        disp(['第' num2str(i) '列是极小型指标,正在进行正向化'] )
        posit_x = Min2Max(x);  %调用“Min2Max函数”来进行正向化。
        disp(['第' num2str(i) '列极小型正向化已经处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~')%%极小型处理完成
    elseif type == 2  %判断是否为中间型的指标
        disp(['第' num2str(i) '列是中间型的指标'] )
        best = input('请输入最佳的一个值: ');%输入一个最好的值
        posit_x = Mid2Max(x,best);%%调用Mid2Max函数
        disp(['第' num2str(i) '列中间型指标正向化处理已完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    elseif type == 3  %判断是否为区间型的指标
        disp(['第' num2str(i) '列是区间型指标'] )%矩阵拼接
        a = input('请输入区间的最左: ');
        b = input('请输入区间的最右: '); 
        posit_x = Inter2Max(x,a,b);
        disp(['第' num2str(i) '列区间型正向化处理已完毕'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    else
        disp('没有这检测到这种类型的评价指标,请检查Type向量中是否其他值')
    end
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值