代码如下

# 主函数代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
clear;clc
load data_water_quality.mat
//正向化
[n,m] = size ( X ) ;
disp ( ['共有'num2str ( n ) '个评价对象,'num2str ( m ) '个评价指标] )
Judge = input (['这'num2str(m)'个指标是否需要经过正向化处理,需要输入1,不需要输入0:']);
if Judge == 1
Position = input ('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]:') ;
disp ( '请输入需要处理的这些列的指标类型(1:极小型,2:中间型,3:区间型)')
Type = input ('例如2极小,3区间,6中间就输入[1,3,2]:' ) ;
for i = 1 : size ( Position , 2 )
X ( : , Position ( i ) ) = Positivization ( X ( : , Position ( i ) ) , Type ( i ) , Position ( i ) ) ;
//Positization是我们定义的函数
end
disp ('正向化后的举证X=' )
disp ( X )
end
//对正向化对举证进行标准化
Z = X ./ repmat ( sum ( X .* X ) .^ 0.5 , n , 1 ) ;
disp ( '标准化矩阵Z=' )
disp (Z)
//计算最大值与最小值的距离,并算出得分
D_P = sum ( [Z - repmat ( max ( Z ) , n , 1 ) .^ 2 ] , 2 ) .^ 0.5 ;
D_N = sum ( [Z - repmat ( min ( Z ) , n , 1 ) .^ 2 ] , 2 ) .^ 0.5 ;
S = D_N ./ ( D_P + D_N ) ;
disp ( '最后的得分为:' )
stand_S = S / sum ( S )
[sorted_S , index] = sort ( stand_S , 'descend' )

# Positivization 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function [ posit_x ] = Positivization ( x , type , i ) 
if type == 1
disp(['第'num2str ( i ) '列是极小型,正在正向化'])
posit_x = Min2Max ( x ) ;
disp(['第'num2str ( i ) '列正向化处理完成])
disp('~~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~~~')
else if type == 2
dis ( ['第'num2str ( i ) '列是中间型'])
best = input ('请输入最佳的那一个值:') ;
posit_x = Mid2Max ( x , best ) ;
disp(['第'num2str ( i ) '列正向化处理完成]) ;
disp('~~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~~~')
else if type == 3
dis ( ['第'num2str ( i ) '列是区间型'])
a = input ('请输入区间的下界') ;
b = input ('请输入区间的上界') ;
posit_x = Inter2Max ( x , a , b ) ;
disp(['第'num2str ( i ) '列正向化处理完成]) ;
disp('~~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~~~')
else
disp ('没有这种类型的指标请检查Type向量中是否有除了1、2、3以外的其他值')
end
end

# Min2Max (x) 函数

1
2
3
function [ posit_x ] = Min2Max ( x ) 
posit_x = max ( x ) - x ;
end

# Mid2Max (x,best) 函数

1
2
3
4
function [ posit_x ] = Mid2Max ( x , best )  
M = max ( abs ( x - best ) ) ;
posit_x = 1 - abs ( x - best ) / M ;
end

# Inter2Max (x,a,b) 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
function [ posit_x ] = Inter2Max ( x , a , b ) ; 
M = max ([ a - min ( x ) , max ( x ) - b ] ) ;
r_x = size ( x , 1 ) ;
posit_x = zeros ( r_x , 1 ) ;
for i = 1 : r_x
if x(i) < a
posit_x(i) = 1 - ( a - x(i) ) / M ;
else if x(i) > b
posit_x(i) = 1 - ( x(i) - b ) / M ;
else posit_x(i) = 1 ;
end
end
end

# 原始矩阵正向化

将 Excel 内的数据直接粘贴进 matlab 里,赋值给变量
将此变量另存为至与代码相同的目录下
调用直接用 load xxx.mat

# sort 函数

sort (A) 若 A 是向量不管是列还是行向量,默认都是对 A 进行升序排序,sort (A) 是默认的升序,而 sort (A,'descend') 是降序
若 A 是矩阵,默认对 A 的割裂进行升序排列
sort (A , dim) ;
dim = 1 时 等效于 sort (A) ;
dim = 2 时 表示对 A 的各列进行升序排列
若欲爆裂排列前的索引,则可用 [sA,index] = sort ( A , 'decend' ) ;
A = [ 2 , 1 , 3 , 8 ]
sA = [ 8 , 3 , 2 , 1 ]
index = [ 4 , 3 , 1 , 2 ]

# 定义函数

function [输出变量] = 函数名称(输入变量)
函数的中间部分都是函数体
函数的最后要用 end 结尾
输出变量和输入变量可以有多个,用逗号隔开
例如:

1
2
3
4
5
function [ a , b , c ] = test ( d , e , f ) 
a = d + e ;
b = e + f ;
c = f + d ;
end

# zeros, ones 函数

zeros ( 3 ) ;

1
2
3
4
ans = 
0 0 0
0 0 0
0 0 0

zeros ( 3 , 1 ) ;

1
2
3
4
ans = 
0
0
0

ones 同理

更新于 阅读次数