用矩陣表示圖形,矩陣中為1的部分表示該兩點間有連線,怎樣根據矩陣來求任意兩點間的最短距離的數量啊

2022-06-07 23:32:17 字數 5807 閱讀 7110

1樓:丙星晴

根據lz要求,最合適的是floyd演算法

下面就是根據這個演算法寫的**,lz可以自己改成函式d=[0 1 0 1 0 0

1 0 1 0 0 0

0 1 0 1 1 1

1 0 1 0 1 0

0 0 1 1 0 1

0 0 1 0 1 0];

n=length(d);

for k=1:n

for i=1:n

for j=1:n

if 0

d(i,j)=d(i,k)+d(k,j);

else

d(i,j)=min(d(i,j),d(i,k)+d(k,j));

endend

endend

end答案就儲存在d矩陣當中,這裡

d =0 1 2 1 2 31 0 1 2 2 22 1 0 1 1 11 2 1 0 1 22 2 1 1 0 13 2 1 2 1 0演算法為o(n3)的,256^3=2^24 大概等於1600萬效率上完全能夠忍受。

2樓:匿名使用者

好好看看運籌學裡的鄰接矩陣、權矩陣

在matlab中怎樣求矩陣中任意兩點間的距離呢

3樓:匿名使用者

根據lz要求,最合適的是floyd演算法

下面就是根據這個演算法寫的**,lz可以自己改成函式d=[0 1 0 1 0 0

1 0 1 0 0 0

0 1 0 1 1 1

1 0 1 0 1 0

0 0 1 1 0 1

0 0 1 0 1 0];

n=length(d);

for k=1:n

for i=1:n

for j=1:n

if 0

d(i,j)=d(i,k)+d(k,j);

else

d(i,j)=min(d(i,j),d(i,k)+d(k,j));

endend

endend

end答案就儲存在d矩陣當中,這裡

d =0 1 2 1 2 31 0 1 2 2 22 1 0 1 1 11 2 1 0 1 22 2 1 1 0 13 2 1 2 1 0演算法為o(n3)的,256^3=2^24 大概等於1600萬效率上完全能夠忍受。

4樓:風地觀的骨架

我們老師給的標準程式,我原封不動送給你吧,系統地講最短路問題的,要用在你的矩陣的情況的話記得把你裡面0全改成inf,耐心看吧,闡述得很完整了,絕對是個高效的演算法:

dijkstra演算法

edser dijkstra 是荷蘭計算機科學家,於2023年發表了dijkstra演算法,時年29歲. 這演算法計算具有非負權的n階矩陣w的圖上從源點s(source), s(1..n), 出發到達所有各點k, k=1..

n, 的最短路。(edward f. moore 在2023年也得到類似的演算法).

演算法1. 對每個點i指定乙個離點s的距離初始值l(i). 在始點s的值為零, 即l(s)=0,其它點的值為inf.

2. 所有的點標記為未走訪的. 置始點s為當前點c.

3. 對於當前點c, 考慮它的所有未走訪的相鄰點j, 並更新j的距離值為

l(j)=min(l(j), l(c)+w(c,j))

4. 把當前點c標記為走訪過的點. 走訪過的點c的距離l(c)就是點s到c的最短距離, 而且以後不再檢查走訪過得點了.

5. 如果所有的點都是走訪過的點, 完成. 不然, 把未走訪的點中具有最小距離值的點作為下乙個當前點c, 轉步驟3.

編制程式的要求: 給定n階非負權矩陣w, w(i,j)是從點i到點j的距離, w(i,i)的值可以賦以任意值(比較方便的是賦以inf). 如果只需求源點s(source)到達指定的終點t(target),給出最短路徑z及其長度l(t); 如果不指定終點t時,z是乙個n維行向量,z(k)表示s點到k點的最短路上k點的前一點, z(s)=0, l是乙個n維行向量, l(k)是s點到k點的最短距離.

如果不給出源點s及終點t, 則預設源點s=1, 按不指定終點的情況辦.

matlab函式子程式dijkstra.m為:

function [l,z]=dijkstra(w,s,t)

%用 dijkstra 演算法求最短路,w(i,j)是從點 i 到點 j 的距離, w(i,i)=0,i,j=1..n; 點 i 和點 j 無邊直接相連時,w(i,j)=inf.

% l表示從始點 s 到終點 t 的最短距離, z 表示點 s 到 t 的一條最短路徑. 當不給出終點 t 時,l(j)表示從點 s 到點 j 的最短距離, j=1..n; z(i)表示最短路徑上點 i 的前一點(父親點),

% 可由 z 追溯最短路徑,當不給出起點 s 及終點 t 時預設 s = 1 及按不指定終點的情況辦.

if nargin<2 s=1;t=0; elseif nargin<3 t=0; end;%如只給出w, 預設始點 s=1;算出s到所有點的距離; 如沒給出終點, 算出s到所有點的距離;

n=length(w(:,1));%頂點數

l=inf*ones(1,n);,l(s)=0;%l賦初值,在s點為0,其它點為inf

c=s; %當前點為始點s

q=1:n;% 未走訪的頂點集

z=s*ones(1,n); z(s)=0;% z賦初值,因始點 s 無父親點,故把 s 點的z值改為0

for k=1:n % 更新 l 和 z 的迴圈

q=setdiff(q,c); %當前點 c 未走訪的點集

[l(q),ind]=min([l(q);l(c)+w(c,q)]);%當前點c已走訪了所有的相鄰的未走訪的點,更新 l

z(q(find(ind==2)))=c; %更新z, 至此c已是走訪過的點了

if t&c==t %若 c 點是終點 t, 不用再計算到其它未走訪的點的最短路

l=l(t); %最短路長;

road=t;%最短路徑終點;

while t~=s%追溯最短路徑上的點

t=z(t); road=[road,t];

endz=road(length(road):-1:1); %顛倒次序;

return;

end;

[null, mc]=min(l(q));

if null==inf

disp('到值是inf的點的路不通!'); z(find(l==inf))=nan; return;

else

c=q(mc);% 把未走訪的點集q中與始點距離最近的點作為新的當前點c;

end;end;

dijkstra演算法的證明:

以下實質上是用動態規劃思想的證明.

記第 k 階段開始時考慮的當前點為c(k),則第 k 階段完成時確定的當前點為c(k+1),記集合p(k)=, 記 q(k)為 p(k) 的餘集. 我們來證明對於每個點v∈p(k), l(v)是從源點s到點v點的最短路的長度, k=1..n.

證明:對 k 施行數學歸納法,當 k=1 時, p(1)=, v=s, l(v)=0, 命題真; 設對於k=m, m≥1, n≥m時命題真, 即當v∈p(m)時, l(v)是s到v的最短路的長度. 由於p(m+1)=p(m)∪, 所以只要證明 l(c(m+1))是點s到c(m+1)點的最短路的長度.

記 r:=c(1)..c(m+1) 是從 s=c(1) 到 c(m+1)的任意一條路, 記l(c(j);i)為在k=i階段, j>i時更新的l(c(j))的值.

則從 s 出發沿路 r 往 c(m+1)走時, 必存在第一條邊(c(i),c(j))使得c(i)∈p(m),c(j)∈q(m). 由歸納假設, 這條路 r 的長度w(r)≥l(c(i))+w(c(i),c(j))+w(c(j)..c(m+1))

≥l(c(i))+w(c(i),c(j)).

按演算法,在第k=i階段完成時,l(c(i))+w(c(i),c(j))≥l(c(j);i). 因i≤m, 故l(c(j);i)≥l(c(j);m), 從而w(r)≥l(c(j);m). 由演算法, l(c(m+1))≤l(c(j);m); 故w(r)≥l(c(m+1)); 另外按演算法, 確有長度等於l(c(m+1))的一條路徑, 證畢.

5樓:匿名使用者

你看看下面這個程式是不是你要的。

matlab中已知各點的位置座標,也知道每點之間的鄰接矩陣,如何繪製出圖形

6樓:匿名使用者

使用gplot函式,很容易就能畫出圖

gplot(a,xy);

a是鄰接矩陣,大小是nxn,(n個節點的鄰接矩陣)xy是各點的座標,是nx2的矩陣,存放n個點的x,y座標gplot會連根據a連線點

求助:兩個矩陣之間用乙個小圓圈連線是什麼運算

7樓:劉茂非律師

沒有這種符號,有可能是定義運算符號.你說的是不是矩陣乘法:矩陣乘法是一種高效的演算法

回可以把答一些一維遞推優化到log( n ),還可以求路徑方案等,所以更是是一種應用性極強的演算法.矩陣,是線性代數中的基本概念之一.乙個m×n的矩陣就是m×n個數排成m行n列的乙個數陣.

由於它把許多資料緊湊的集中到了一起,所以有時候可以簡便地表示一些複雜的模型.

求鄰接矩陣任意兩點間的最短距離。matlab。程式在下面有沒有哪位大神能給解釋一下後邊的是什麼意思 50

8樓:匿名使用者

用floyd演算法也可以,另外乙個取巧的方法是把plus過載成min,mtimes過載成plus,然後直接把鄰接矩陣求n次方(n是結點個數)就行了

9樓:活寶上大夫

根據lz要求,最合適的是floyd演算法

下面就是根據這個演算法寫的**,lz可以自己改成函式d=[0 1 0 1 0 0

1 0 1 0 0 0

0 1 0 1 1 1

1 0 1 0 1 0

0 0 1 1 0 1

0 0 1 0 1 0];

n=length(d);

for k=1:n

for i=1:n

for j=1:n

if 0

d(i,j)=d(i,k)+d(k,j);

else

d(i,j)=min(d(i,j),d(i,k)+d(k,j));

endend

endend

end答案就儲存在d矩陣當中,這裡

d =0 1 2 1 2 31 0 1 2 2 22 1 0 1 1 11 2 1 0 1 22 2 1 1 0 13 2 1 2 1 0演算法為o(n3)的,256^3=2^24 大概等於1600萬效率上完全能夠忍受。

MATLAB如何生成這樣的矩陣 矩陣為1行254列,由1,2,3,4,5,6,7這幾個數字組成,組成規則是

x,y,z ndgrid 1 7 p x y z 獲得所copy有可能的3個數的排列 r p 1 p 2 p 2 p 3 p r,除去有連bai續值得排列a zeros 1,254 a 1 3 p 1,選取dup的第一行作為最開始三個數p 1,刪除掉該zhi行,不再允許該組合dao出現for ii ...

矩陣A的意義,( 1)A與 A表示的意義有什麼區別?A是矩陣。雖然( 1)A A。

矩陣a 的意義 1 把a的每個元素都換成它的代數余子式 代數余子式定義 在乙個n級行列式d中,把元素第i行第j列元素aij i,j 1,2,n 所在的行與列劃去後,剩下 的 n 1 2個元素按照原來的次序組成的乙個n 1階行列式mij,稱為元素aij的余子式,mij帶上符號 1 i j 稱 為aij...

matlab如何將矩陣中的1逐個替換為

a 2,5 1,4 1,4 3,6 3,6 2,5 假設baia是你想du將1替換為zhi0的矩陣 a a 1 0 可將矩dao陣a中的1全部專替屬換為0 matlab怎麼能隨機的替換矩陣中的數,比如乙個0 1矩陣,把矩陣中的0隨機選幾個替換為1,不是全部替換 a是0 1矩陣 l find a t ...