% 下面我们来初始化path矩阵 path = zeros(n); forj = 1:n path(:,j) = j; % 将第j列的元素变为j end fori = 1:n path(i,i) = -1; % 将主对角线元素变为-1 end
% 下面开始三个循环 for k=1:n % 中间节点k从1- n 循环 fori=1:n % 起始节点i从1- n 循环 forj=1:n % 终点节点j从1-n 循环 if dist(i,j)>dist(i,k)+dist(k,j) % 如果i,j两个节点间的最短距离大于i和k的最短距离+k和j的最短距离 dist(i,j)=dist(i,k)+dist(k,j); % 那么我们就令这两个较短的距离之和取代i,j两点之间的最短距离 path(i,j)=path(i,k); % 起点为i,终点为j的两个节点之间的最短路径要经过的节点更新为path(i,k) % 注意,上面一行语句不能写成path(i,j) = k; 这是网上很多地方都容易犯的错误,在PPT11页中会告诉大家为什么不能这么写 end end end end
[dist,path] = Floyd_algorithm(D); % 调用之前的Floyd_algorithm函数 n = size(D,1); if n == 1 warning('请输入至少两阶以上的权重邻接矩阵') % 在屏幕中提示警告信息 return; % 不运行下面的语句,直接退出函数 end
for i = 1:n for j = 1:n if i ~= j % 不等号用~=表示 print_path(path,dist,i,j); % 调用之前的print_path函数 disp('-------------------------------------------') disp(' ') end end end
C=0; n=size(X,1); IDX=zeros(n,1); % 初始化全部为0,即全部为噪音点 D=pdist2(X,X); visited=false(n,1); isnoise=false(n,1); fori=1:n if ~visited(i) visited(i)=true; Neighbors=RegionQuery(i); ifnumel(Neighbors)<MinPts % X(i,:) is NOISE isnoise(i)=true; else C=C+1; ExpandCluster(i,Neighbors,C); end end end functionExpandCluster(i,Neighbors,C) IDX(i)=C; k = 1; whiletrue j = Neighbors(k); if ~visited(j) visited(j)=true; Neighbors2=RegionQuery(j); ifnumel(Neighbors2)>=MinPts Neighbors=[Neighbors Neighbors2]; %#ok end end if IDX(j)==0 IDX(j)=C; end k = k + 1; if k > numel(Neighbors) break; end end end functionNeighbors=RegionQuery(i) Neighbors=find(D(i,:)<=epsilon); end