一画机、句柄的相關概念的理解
句柄的相關概念參照我的另一篇文章:Matlab 句柄相關概念總結
二、尋徑算法的代碼實現(xiàn)
% 路線權的定義
w = [2 1 8 6 1 7 9 5 1 2 3 9 4 6 3];
% 鄰接矩陣的構造
DG = sparse([1 1 1 2 2 3 3 4 4 4 5 5 6 6 7],[2 3 4 4 5 4 7 5 6 7 6 8 7 8 8],w,8,8);
first = input('請輸入初始節(jié)點:');
last = input('請輸入終止節(jié)點:');
% 有向賦權圖的繪制
h = view(biograph(DG,[],'ShowWeights','on'));
[dist,path,pred] = graphshortestpath(DG,first,last);
% 標記路線經(jīng)過的節(jié)點
set(h.Nodes(path),'Color',[1 0.6 0.6]);
% 標記路線經(jīng)過的路徑
edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'),get(h.Nodes(path),'ID'));
set(edges,'LineColor',[1 0 0]);
set(edges,'LineWidth',2.0);
%% 關于代碼實現(xiàn)的解釋
1、DG = sparse([1 1 1 2 2 3 3 4 4 4 5 5 6 6 7],[2 3 4 4 5 4 7 5 6 7 6 8 7 8 8],w,8,8);
sparse(i,j,v,m,n)
根據(jù) i、j 和 v 三元組生成稀疏矩陣 S,以便 S(i(k), j(k)) = v(k)渗钉,將 S 的大小指定為 m×n。圖論矩陣必須要用稀疏矩陣钞钙。通常需要指定鄰接矩陣的維數(shù) 鳄橘,否則會出現(xiàn)報錯。
關于 sparse 的具體用法以及原理可以參照:稀疏矩陣-百度百科
DG 是個 8*8 的矩陣歇竟,第一行表示節(jié)點起點挥唠,第二行表示節(jié)點終點,w 是權值焕议,因為這樣創(chuàng)建的矩陣是一個上三角矩陣宝磨,構造的是一個有向圖。
無向圖需要這樣操作:在 graphshortestpath 函數(shù)設置方向盅安,‘Directed’唤锉,0
,關閉默認的有向圖得到的是一個完整的矩陣别瞭,節(jié)點之間可以相互到達窿祥,沒有方向。但直接導入鄰接矩陣的話蝙寨,矩陣返回的是一個雙向的路徑圖晒衩,選定節(jié)點到其他節(jié)點分別有兩條路徑。大家可以嘗試去實現(xiàn)看一下效果墙歪。關于無向賦權圖的代碼實現(xiàn)听系,可以通過h = view(biograph(DG,[],'ShowArrows','off','ShowWeights','on'));
關閉 'ShowArrows' 箭頭顯示。
2虹菲、h = view(biograph(DG,[],'ShowWeights','on'));
BG = biograph(CM,IDs)
這條語句設置節(jié)點的序號名稱靠胜。IDs 可以使一個元胞數(shù)組,數(shù)組中每個元素表示一個名字毕源,數(shù)組長度與 CM 矩陣行列長度一致浪漠。IDs 也可以是一個字符數(shù)組(此時各個節(jié)點的名字長度相同)。IDs 必須是唯一的霎褐,不能重復址愿。
根據(jù) DG 矩陣構建路線圖,[ ] 中可以通過輸入元胞數(shù)組的形式對節(jié)點進行命名瘩欺。
例如:{'城市1','城市2','城市3','城市4','城市5','城市6','城市7','城市8'}
'ShowWeights','on'
控制指示邊緣權重的文本顯示必盖。 選擇是 “開啟” 或 “關閉”(默認)拌牲。
h = view(biograph)
打開一個圖窗口并繪制一個由 Biograph 對象表示的圖形,在圖窗口中返回 Biograph 對象的深層副本的句柄歌粥。 更新現(xiàn)有圖形時塌忽,可以使用返回的句柄以編程方式或從命令行更改對象屬性。 關閉圖窗口時失驶,句柄不再有效土居。 原始的 Biograph 對象保持不變。
3嬉探、[dist,path,pred] = graphshortestpath(DG,first,last);
DG 是稀疏矩陣擦耀,first 是起點,last 是終點涩堤。
dist 表示最短距離眷蜓,path 表示最短距離經(jīng)過的路徑節(jié)點,pred 表示從 first 到每個節(jié)點的最短路徑中胎围,目標節(jié)點的先驅吁系,即目標節(jié)點的前面一個節(jié)點。
4白魂、set(h.Nodes(path),'Color',[1 0.6 0.6]);
根據(jù) grapnshortestpath 中返回的 path汽纤,對相關節(jié)點進行修改操作。例如可以改變顏色福荸。
[1 0.6 0.6]:matlab 中的顏色可以使用三維向量表示蕴坪,為[r g b]
,其中各個元素的取值在 0 到 1 之間敬锐,r 為紅色背传,g 為綠色,b 為藍色台夺,它和我們常用的使用 256 表示的顏色是一一對應的续室。
5、edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'),get(h.Nodes(path),'ID'));
getedgesbynodeid
谒养,從英文本意上理解為:按節(jié)點 ID 獲取邊緣,我們不難知道它的用法
關于代碼edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'),get(h.Nodes(path),'ID'));
實測與edges = getedgesbynodeid(h,get(h.Nodes(path),'ID'));
實現(xiàn)效果一致明郭。
EDGES = getedgesbynodeid(BIOGRAPH,SOURCE_IDS,SINK_IDS) gets the edge
handles that connect any of the nodes' SOURCE_IDS to any of the nodes'
SINK_IDS. SOURCE_IDS and SINK_IDS can be either strings, cell strings,
or empty strings (gets all).
% 獲取連接任何節(jié)點的source_id到任何節(jié)點的sink_id的邊緣句柄买窟。
% source_id和sink_id可以是字符串、單元格字符串或空字符串(獲取所有字符串)薯定。
三始绍、set、get的用法總結
set:設置圖形對象屬性
set(H,Name,Value)
為 H 標識的對象指定其 Name
屬性的值话侄。使用時須用單引號將屬性名引起來亏推,例如学赛,set(H,'Color','red')
。如果 H 是對象的向量吞杭,則 set 會為所有對象設置屬性盏浇。如果 H 為空(即 []),set 不執(zhí)行任何操作芽狗,但不返回錯誤或警告绢掰。
set(H,NameArray,ValueArray)
使用元胞數(shù)組 NameArray
和ValueArray
指定多個屬性值。要為 m 個圖形對象中的每個圖形對象設置 n 個屬性值童擎,請將ValueArray
指定為 m×n 的元胞數(shù)組滴劲,其中 m = length(H)
,而 n 等于 NameArray
中包含的屬性名的數(shù)量顾复。
get:查詢圖形對象屬性
v = get(h)
返回 h 標識的圖形對象的所有屬性和屬性值班挖。
v = get(h,propertyName)
返回特定屬性 propertyName 的值。使用時須用單引號將屬性名引起來芯砸,例如萧芙,get(h,'Color')
。
最后的實現(xiàn)效果: