天天看點

MATLAB新手學習1——層次分析法代碼

馬上就要五一校賽了,作為新手的我在隊伍裡負責了代碼的方面,在學習過程中從b站找到了由清風老師主講的課程,并開始認真學習。在視訊中老師是按照先進行權重計算後進行一緻性檢驗進行課程的,但是老師也說了,這樣隻是為了課程編排,實際的邏輯操作中應該先進行一緻性檢驗後進行權重求和,是以此處就按照後一個順序進行代碼的編寫。

MATLAB新手學習1——層次分析法代碼

這套課程老師講解的很詳細,在配套的代碼注釋裡還特意提到了這個問題。

步驟一:進行一緻性檢驗

MATLAB新手學習1——層次分析法代碼

首先求判斷矩陣的最大特征根及其對應的特征向量,再計算一緻性

MATLAB新手學習1——層次分析法代碼

(1)對矩陣每一列歸一化(這部分的數學公式在網上也有很多,可以百度一下)

每一個元素除以其所在列的和

任務:按列求和

代碼:要是沒學matlab的話就會像C語言一樣寫一個for循環,但matlab就要學會調用各種函數 平時我們指導sum有和的意思,在matlab裡也一樣 指令行輸入一個help sum檢視相關函數

按列求和:sum(A,1)=sum(A)

任務2:相除——處理和

來源help:沿次元 dim 傳回總和。例如,如果 A 為矩陣,則 sum(A,2) 是包含每一行總和的列矢量。而sum(A)就是行向量

1 2 4 6

3 4

首先先讓我們來數一下A矩陣吧,這個在C語言裡會有一個sizeof之類的函數會有數長度之類的功能,在mtalab裡說size,注意,這是矩陣,不是二維數組!!!!從1開始!!!!

help:當 A 是矩陣時,[m,n] = size(A) 傳回行數和列數。

如果想把元素對應相除,先要擴充SUMA矩陣

方法1repmat函數

方法2 for循環拼接

這兩個函數可以help查找使用方法

此處采用for循環

[m n]=size(A);
SUM_A=[];
for x=1:n
    SUM_A=[SUM_A;SUM];
end
在這裡插入代碼片
           

任務3:相除——逐個相除

區分 / 與 ./就好(./是對應的元素之間)

Stand_A=A./SUM_A
           

(2)對按列歸一化的矩陣,在按行求和

任務:求和-按行

sum

結果:列向量

(3)将向量進行歸一化

對列向量各個元素求和,除一下

SUM_3=sum(SUM_2);
Stand_A_1=Stand_A/SUM_3;
           

(4)計算最大特征根

特征根:線代的知識

任務1 求特征根

此刻C語言裡貌似找不到相關内容了,但是如果暴力代碼解方程的話又有點,麻煩,是以百度一下有沒有相關函數,得到結果:help eig

e = eig(A) 傳回一個列矢量,其中包含方陣 A 的特征值

[V,D] = eig(A) 傳回特征值的對角矩陣 D 和矩陣 V,其列是對應的右特征矢量,使得 AV = VD。

此處需要使用D矩陣

任務2 求最大值

聯想一下max help一下

M = max(A) 傳回 A 的最大元素。

如果 A 為矢量,則 max(A) 傳回 A 的最大元素。

如果 A 為矩陣,則 max(A) 是包含每一列的最大值的行矢量

此時D為矩陣,max一下是行矢量,那我們就max兩下吧

接下來進行一緻性檢驗

1.根據公式計算CI,注意運算優先級

此時公式裡的n,其實就是一個決策層的一個個數,具體值傳回size(A)的部分分析

2.RI 根據n确定

R=[0 0 0.58 0.9 1.12 1.24 1.38 1.41 1.46];
RI=R(m)
           

3.計算一緻性比例

CR=CI/RI;
if CR<0.1
    disp('OK')
else
    disp('NO,you need reset it')
end

           

步驟二:求權重

方法一:算數平均法

step1 歸一化 在之前已經完成

step2 将歸一化後的行向量按列相加

step3 權重=将standA除以上面那個數

SUM_AVE_1=sum(Stand_A,1);
disp('算數平均法')
disp(Stand_A/SUM_AVE_1)
           

方法二:幾何平均法(歸一化後

幾何平均數是對各變量值的連乘積開項數次方根。求幾何平均數的方法叫做幾何平均法。

step1 按行相乘 然後開方

step2 把這些數相加

step3 把這些數分别除那個合數

Prod=prod(Stand_A,2);
Prod_A=Prod.^(1/n);
Sum_prod=sum(Prod_A);
disp('幾何平均法')
disp(Prod_A/Sum_prod)
           

方法三 特征值法求權重(歸一化後

step1 求出最大特征值,已經求了

step2 求出最大特征值對應的特征向量

任務一:找出最大特征值所在的位置

運用find 和==

得到該特征向量V(:,c),此處c為列數,特征向量為一個行向量

對所有特征向量求和,然後相除

sum(V(:,c));
disp('特征值法求權重')
disp(V(:,c)/sum(V(:,c)))
           

運作結果

Stand_A =

    0.1791    0.1791    0.2857    0.1429    0.2857
    0.1791    0.1791    0.2857    0.1429    0.2857
    0.0448    0.0448    0.0714    0.1429    0.0476
    0.5373    0.5373    0.2143    0.4286    0.2857
    0.0597    0.0597    0.1429    0.1429    0.0952


RI =

    1.1200

OK
算數平均法
    0.2145
    0.2145
    0.0703
    0.4006
    0.1001

幾何平均法
    0.2184
    0.2184
    0.0664
    0.3985
    0.0983

特征值法求權重
    0.2121
    0.2121
    0.0679
    0.4114
    0.0965

>> 
           

繼續閱讀