matlab練習程式(Kruskal最小生成樹)

2021-09-07 21:22:32 字數 2058 閱讀 2810

老物了,網上的例子多的數不過來。不過我還是有必要練習一下的。

之所以看這個演算法是因為最近在看顏色聚合向量時,有的**用到了最小生成樹,因此我就拿來熟悉一下。

kruskal演算法類似於連通分支演算法,感覺和過去實現過的連通區域標記演算法非常像。

步驟:1.對於乙個圖,將圖的每條邊提取出來從小到大進行排序。

2.將已排序的邊依次加入到新圖中,如果新圖**現了環,那麼就捨棄這條邊。

3.不斷重複第二步。

下面兩個圖就是kruskal演算法前後的樣子。

**如下:

main.m

clear all;

close all;

clc;

%演算法導論p349的列子

g=[040

0000

80; 40

8000

0110;

0807040

02; 00

70914

000;

00090100

00; 00

414100

200;

0000020

16; 811

0000

107;

0020006

70];[m n]=size(g);

e=;k=0

; %邊的數量

for i=1

:m

for j=i:n

if g(i,j)~=0

e=[e;g(i,j) i j]; %提取邊,三元組儲存

k=k+1

;

endend

endfor i=k:-1:1

%按邊的權重排序,小的排前面

for j=1:i-1

if e(j,1)>e(j+1,1

) tmp=e(j,:);

e(j,:)=e(j+1

,:);

e(j+1,:)=tmp;

endend

enda=zeros(m,n);

for i=1

:k

a(e(i,

2),e(i,3))=e(i,1

); a(e(i,

3),e(i,2))=e(i,1

);

ifhuan(a) %加入邊後判斷圖中是否含有環

a(e(i,

2),e(i,3))=0

; a(e(i,

3),e(i,2))=0

;

endend

huan.m

function re=huan(a)

[m n]=size(a);

while

1pre_a=a;

for i=1

:m du=0

; %第m個元素的度

for j=1

:n

if a(i,j)~=0

du=du+1

;

endend

if du==1

%元素的度為1時刪除這個元素,其相鄰元素度減一

a(i,:)=0

; a(:,i)=0

;

endend

if pre_a==a %圖中沒有度為1的元素則退出

break

;

endend

if sum(a(:))==0

re=0

;

else

re=1

;

endend

matlab練習程式(DBSCAN)

和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...

matlab練習程式(c c 呼叫matlab)

就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...

matlab練習程式(SUSAN檢測)

susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...