?? ccpoints.m
字號:
function cpp=ccpoints(be,en,sd,gd,s)
%余枝搜索法搜索閉合環
%be 起點 en 終點 sd 總點數 gd 觀測值 s 距離
cpp=[]; %存放閉合環點號信息
bee=be;
enn=en;
temp=[];
course=zeros(1,gd); %標記觀測邊號
%建立生成樹==========================================================
% while 2
g=size(bee,1);
num=zeros(1,sd);
%計算結點度
for i=1:g
num(bee(i))=num(bee(i))+1;
num(enn(i))=num(enn(i))+1;
end
%取出最大度結點,以最大度結點為起始點建立生成樹
[degreenum,pointnum]=max(num);
been=[bee enn];
temp1=[];
i1=0;
i2=0;
[i,j]=find(been==pointnum);
tem=been(i,:);
tem=reshape(tem,1,prod(size(tem)));
tem((tem==pointnum))=[];%2級點樹枝的點號
temp=[temp pointnum tem];%已記錄的點
course(i)=1; %標記樹枝
while 1%樹是否已包含所有的點
if size(temp,2)==sd;%首先判斷是否所有的點都已記錄
break;
end
for i=tem
[i1,j1]=find(i==been);
beentem=been(i1,:);
for j=1:size(beentem,1);
xxx=beentem(j,:);
newpoint=xxx(xxx~=i);
if any(temp==newpoint)==0; %若不是已記錄的點
temp=[temp newpoint];
temp1=[temp1 newpoint];%3級點
course(i1(j))=1;%也標記為樹枝
end
end
end
tem=temp1;
temp1=[];
if size(temp,2)==sd;%所有點已記錄
break;
end
if isempty(tem)==1;%無新點產生
break;
end
end
%course=1標記樹枝;course=0標記余枝
[i j]=find(course==0);
ns=length(i);%余枝數,也即閉合環數
%--------------------------------------------------------------------
if ns>0
A=[];
B=[];
for i=1:gd
if course(i)==0
B=[B;be(i) en(i) s(i)];%余枝邊長記錄
else
A=[A;be(i) en(i) s(i)];%樹枝邊長記錄
end
end
r=ns;
rr=r;
site=[];
m=[];
for xyt=1:rr%閉合環數
number=zeros(1,r);
site1=[];
dist1=[];
for ii=1:r
n=1;%支路數
course=[];
been=[];
i=[];
j=[];
st=[];
dt=[];
course=zeros(1,gd);%以新點點號標記該觀測值
been=A(:,1:2);
temp1=[];
i1=0;
i2=0;
[i,j]=find(been==B(ii,2));%從第ii余枝的終點開始找與之相連的樹枝點
tem=been(i,:);
tem=reshape(tem,1,prod(size(tem)));
tem((tem==B(ii,2)))=[];%新點點號
temp=[B(ii,2) tem];%已搜索到的點號
course(i)=B(ii,2);%標記與該余枝點相連的樹枝
%正向尋找
while 1
n=n+1; %支路個數
for i=tem
[i1,j1]=find(i==been);
beentem=been(i1,:);
for j=1:size(beentem,1);
xxx=beentem(j,:);
newpoint=xxx(xxx~=i);
if any(temp==newpoint)==0;%新點是否已記錄
temp=[temp newpoint];
temp1=[temp1 newpoint];; %存放下一個層次出現的所有新點
course(i1(j))=i; %若為新點,其支路定義為起點的點號,便于后面反向尋找閉合環,在某點上,其支路編號與該點不同的是環上的支路。
end
if newpoint==B(ii,1) %若新點為余支的另一端點
m=i; %存放與余支的另一端點相連的點號
t=i1(j); %該支路在觀測值數組中的序號
break;
end
end
if newpoint==B(ii,1)
break;
end
end
tem=temp1;
temp1=[];
if newpoint==B(ii,1)
break;
end
end
%反向提取閉合環
st=[ m];
di=A(t,3);
while 3
if length(st)==n;
break;
end
[i1,j1]=find(been==m);
tem=i1';
fl=0;
for i=tem
fl=fl+1;
if course(i)~=0 & course(i)~=m
m=course(i);
st=[st m];%閉合環點號
di=di+A(i,3);%閉合路線長
break;
end
end
end
st=[st B(ii,1)];
di=di+B(ii,3);
st=[st st(1)];
site1{ii}=st; %閉合環點號數組,若干閉合環
number(ii)=n+1; %閉合環邊數
dis(ii)=di; %閉合環長度
end
tem=find(number==min(number));%最終的閉合環要符合邊數最少
[i,j]=min(dis(tem));%邊長最短
site{xyt}=site1{tem(j)};
distt(xyt)=dis(tem(j));
r=r-1;
A=[A;B(tem(j),:)];%余枝化為樹枝
B(tem(j),:)=[];%余枝減少
end
cpp=site;
end
return
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -