一、加载数据

把数据复制到工作区,并将矩阵命名为X

1、在工作区右键,点击新建(ctrl+N),输入变量名称为X

2、在Excel中复制数据,再回到X的表格中右键,点击粘贴数据(ctrl+shift+V)

3、关掉窗口,点击X,右键另存为mat文件

(下次就不用复制粘贴了,只需load即可加载数据)

4、注意,代码和数据要放在同一个目录下

load ***.mat

二、定义函数

matlab自定义函数要单独放在一个m文件里

格式:

 function [输出变量]=函数名称(输入变量)

   函数体

 end

% 例如:

% function [a,b,c]=test(d,e,f)

%   a=d+e;

%   b=e+f;

%   c=f+d;

% end

三、完整代码

(补充)关于排序:

sort(A) 默认升序排序 sort(A,'descend')降序排序

sort(A,dim) dim=1 对列排序(没写则默认);dim=2 对行排序

特殊: sort(A) 对于一维行向量也可以按列排序

[sA,index]=sort(A) sA是排序后的向量,index是sA向量元素对A的原索引(索引均从1开始)

主代码: 

clear;clc
load X.mat

%第一步: 判断是否需要正向化
[n, m]=size(X)
disp(['共有',num2str(n),'个评价对象',num2str(m),'个评价指标']) %字符串拼接,c=[a,b]
Judge=input(['这',num2str(m),'个指标是否需要经过正向化处理,需要请输入1,不需要则输入0: ']);
if Judge==1
    Position=input('请输入需要正向化处理的指标所在的列(行向量形式): ');
    disp('1:极小型 2:中间型 3:区间型')
    Type=input('请依次输入需要处理的这些列的指标类型(行向量形式): ');
    for i=1:size(Position,2) %size(Position,2)是求向量的列数
      X(:,Position(i))=Positivization(X(:,Position(i)),Type(i),Position(i));
      %第一个参数: 要正向化处理的列向量
      %第二个参数: 该列的指标类型
      %第三个参数: 该列是原始矩阵的哪一列
      %返回值是正向化后的指标,可以将其直接赋值给原始矩阵的那一列
    end
    disp('正向化后的矩阵X=')
    disp(X)
end

%第二步: 对正向化矩阵标准化
Z=X./repmat(sum(X.*X).^0.5,n,1);
%sum(X.*X) X方阵每个元素先自平方,然后对列求和,得到行向量
%.^0.5开方,得由列元素平方和开方后构成的行向量
%repmat( ,n,1)将该行向量复制n行
disp('正向化后的矩阵Z=')
disp(Z)

%第三步: 由距离公式计算得分
D_MAX=sum( [(Z-repmat(max(Z),n,1)).^2], 2).^0.5 %列向量,各个对象与最大值的距离
D_MIN=sum( [(Z-repmat(min(Z),n,1)).^2], 2).^0.5 %列向量,各个对象与最小值的距离
D=D_MIN./(D_MAX+D_MIN)
stand_D=D./sum(D) %元素点除,还是得列向量,对应各个元素
[sorted_D,index]=sort(stand_D,'descend') %降序排序



Positivization函数代码:

function [posit_x]=Positivization(x,type,i)
  if type==1 %极小型
      posit_x=max(x)-x; %或者posit_x=1/x
  elseif type==2 %中间型
       best=input('请输入最佳值:');
       M=max(abs(x-best));
       posit_x=1-abs(x-best)/M;
  elseif type==3 %区间型
      a=input('请输入区间的下界:');
      b=input('请输入区间的上界:');
      M=max([a-min(x),max(x)-b]);
      posit_x=zeros(size(x,1),1) %先创建好变量空间,再修改之,可以提高效率
      %公式不同,需要逐个赋值
      for i=1:size(x,1) %行数即循环次数
          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
  else
      disp('没有这种指标类型')
  end
end

 

 

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐