matlab 关联矩阵,(案例)利用Matlab实践关联矩阵与邻接矩阵的转换
“利用Matlab實踐關聯矩陣與鄰接矩陣的轉換”
假設網絡圖G=(V,E)的頂點集為V={v1,v2,…,vn},邊集為E={e1,e2,…,em},則該網絡圖的關聯矩陣L就是一個n×m矩陣,其中元素gij表示頂點vi與邊ej相關聯,而鄰接矩陣A是一個n階方陣,其中元素aij表示連接頂點vi與vj的邊。從關聯矩陣和鄰接矩陣的定義來看,二者均是以矩陣形式表示網絡圖結構,同一網絡圖可以有關聯矩陣和鄰接矩陣的兩種表達方式,即可依據其各自定義進行關聯矩陣和鄰接矩陣的相互轉換。通過Matlab進行腳本編碼實現無向圖與有向圖中的關聯矩陣和鄰接矩陣的轉換,進一步熟悉二者矩陣的定義與含義,并掌握用計算機語言操作矩陣運算的編碼方法。
首先在無向圖中實現關聯矩陣和鄰接矩陣的轉換,定義一個轉換函數,通過控制參數實現“關聯矩陣->鄰接矩陣”與“鄰接矩陣->關聯矩陣”的轉換功能。然后考慮連接邊的方向問題,在有向圖中同樣定義一個轉換參數,實現“關聯矩陣->鄰接矩陣”與“鄰接矩陣->關聯矩陣”的轉換功能。
01
—
無向圖中關聯矩陣和鄰接矩陣的轉換函數
在無向圖中,由于連接邊的無向性,因而對于頂點連接關系與頂點/邊關聯關系的轉換相對較為容易。
“鄰接矩陣->關聯矩陣”:先由鄰接矩陣得出網絡圖中所有連接邊的數量與頂點的數量,然后在鄰接矩陣中搜索不為0的元素,即對應某一條連接邊,鄰接矩陣不為0的某元素aij,對應某條邊k的行向量中第i個與第j個元素分別為1。
“關聯矩陣->鄰接矩陣”:先有關聯矩陣獲取連接邊和頂點的數量,然后依次搜索每一條連接邊,如某條邊k的行向量中第i個與第j個元素分別為1,說明頂點i與j存在鄰接關系,即鄰接矩陣的元素aij值為1。代碼:function W=incandadf(F,f) %無向圖中關聯與鄰接矩陣的轉換if f==0 % 鄰接-關聯m=sum(sum(F))/2; %在鄰接矩陣中計算邊的數量n=size(F,1); %節點數量W=zeros(n,m);k=1;for i=1:nfor j=i:nif F(i,j)~=0 %鄰接矩陣中元素不為0說明有連接邊W(i,k)=1; %給邊的起點賦值為1W(j,k)=1; %給邊的終點賦值為1k=k+1; %依次定義每一條邊endendendelseif f==1 % 關聯->鄰接m=size(F,2); %在關聯矩陣中獲取邊的數量n=size(F,1); %在關聯矩陣中獲取頂點的數量W=zeros(n,n);for i=1:ma=find(F(:,i)~=0);%尋找每一條邊即每一列對應不為0的兩個元素W(a(1),a(2))=1; %存在邊,即鄰接矩陣對應值為1W(a(2),a(1))=1; %存在邊,即鄰接矩陣對應值為1endelsedisp("please input the right value of f");endW;
02
—
有向圖中關聯矩陣和鄰接矩陣的轉換函數
類似定義一個轉換函數mattransf(F,f),其中,F為輸入矩陣,f=0表示F是鄰接矩陣,f=1表示F是關聯矩陣。
矩陣轉換方法基本與無向圖中類似,但是在有向圖網絡中,有以下幾個注意問題:
1)有向圖的關聯矩陣中,列向量代表有向邊,值為1 表示起點,值為-1表示終點;
2)無向圖的關聯矩陣直接對應有向圖,則需要用多一倍的列來表示雙向邊;
3)在實現鄰接至關聯矩陣轉換時,Aij與Aji不一定相等,對應的有向邊i->j和j->i需要分別計算和定義;
4)在實現關聯至鄰接矩陣轉換時,需要根據元素值為1或-1判定起點和終點,從而決定是給Aij或Aji賦值為1。代碼:function W=mattransf(F,f)%有向圖的關聯與鄰接矩陣的轉換if f==0 % 鄰接-關聯m=sum(sum(F)); %在有向圖中計算邊的數量,此時Wij!=Wjin=size(F,1); %頂點數量W=zeros(n,m);k=1;for i=1:nfor j=1:nif F(i,j)~=0 %由i出發的有向邊,起點W(i,k)=1; %起點賦值為1W(j,k)=-1; %終點賦值為-1k=k+1;endendendelseif f==1 % 關聯-鄰接m=size(F,2); %邊數n=size(F,1); %頂點數W=zeros(n,n);for i=1:ma=find(F(:,i)~=0); %找到有向邊的兩個頂點if F(a(1),i)==1W(a(1),a(2))=1; %值為1,為起點,a(1)->a(2)elseW(a(2),a(1))=1; %值為-1,為終點,a(2)->a(1)endendelsedisp("please input the right value of f");endW;
03
—
算例無向圖中關聯矩陣和鄰接矩陣的轉換
代碼:%無向圖中鄰接矩陣與關聯矩陣的轉換A=[0 1 1 0 1;1 0 1 0 0;1 1 0 1 1;0 0 1 0 1;1 0 1 1 0];fprintf("原無向圖的鄰接矩陣為:\n")AW=incandadf(A,0);fprintf("由鄰接矩陣轉換成關聯矩陣為:\n")WL=[1 1 1 0 0 0 0;1 0 0 1 0 0 0;0 1 0 1 1 1 0;0 0 0 0 1 0 1;0 0 1 0 0 1 1];fprintf("原無向圖的關聯矩陣為:\n")LW=incandadf(L,1);fprintf("由關聯矩陣轉換成鄰接矩陣為:\n")W結果:原無向圖的鄰接矩陣為:A?=0?????1?????1?????0?????11 0 1 0 01 1 0 1 10 0 1 0 11 0 1 1 0由鄰接矩陣轉換成關聯矩陣為:W?=1?????1?????1?????0?????0?????0?????01 0 0 1 0 0 00 1 0 1 1 1 00 0 0 0 1 0 10 0 1 0 0 1 1原無向圖的關聯矩陣為:L?=1?????1?????1?????0?????0?????0?????01 0 0 1 0 0 00 1 0 1 1 1 00 0 0 0 1 0 10 0 1 0 0 1 1由關聯矩陣轉換成鄰接矩陣為:W?=0?????1?????1?????0?????11 0 1 0 01 1 0 1 10 0 1 0 11 0 1 1 0有向圖中關聯矩陣和鄰接矩陣的轉換
代碼:A=[0 0 0 0 0;1 0 0 0 0;1 1 0 0 0;0 0 1 0 0;1 0 1 1 0];fprintf("原有向圖的鄰接矩陣為:\n")AW= mattransf (A,0);fprintf("由鄰接矩陣轉換成關聯矩陣為:\n")WL=[-1 -1 0 0 -1 0 0;1 0 -1 0 0 0 0;0 1 1 -1 0 -1 0;0 0 0 1 0 0 -1;0 0 0 0 1 1 1];fprintf("原有向圖的關聯矩陣為:\n")LW=mattransf(L,1);fprintf("由關聯矩陣轉換成鄰接矩陣為:\n")W結果:原有向圖的鄰接矩陣為:A?=0?????0?????0?????0?????01 0 0 0 01 1 0 0 00 0 1 0 01 0 1 1 0由鄰接矩陣轉換成關聯矩陣為:W?=-1????-1?????0?????0????-1?????0?????01 0 -1 0 0 0 00 1 1 -1 0 -1 00 0 0 1 0 0 -10 0 0 0 1 1 1原有向圖的關聯矩陣為:L?=-1????-1?????0?????0????-1?????0?????01 0 -1 0 0 0 00 1 1 -1 0 -1 00 0 0 1 0 0 -10 0 0 0 1 1 1由關聯矩陣轉換成鄰接矩陣為:W?=0?????0?????0?????0?????01 0 0 0 01 1 0 0 00 0 1 0 01 0 1 1 0
總結
以上是生活随笔為你收集整理的matlab 关联矩阵,(案例)利用Matlab实践关联矩阵与邻接矩阵的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sublime Text3(mac)一些
- 下一篇: 求邻接矩阵matlab,如何使用MATL