基于MATLAB的控制网平差程序设计--第四章源代码.doc
chkdat函数(72页)
function[n1,k]=chkdat(sd,pn,n1)
n=length(n1);
k=0;
fori=1:n
i1=0;
forj=1:sd
if(n1(i)==pn(j))
i1=1;
n1(i)=j;
break;
end
end
if(i1==0)
%fprintf(fit2,%5d%5d\n,i,n1(i)
k=1;
end
end
return
readlevelnetdata函数(73页)
function[ed,dd,sd,gd,pn,h0,k1,k2,h1,s]=readlevelnetdata
globalfilenamefilepath;
globaledddsdpngdh0k1k2h1sk11k12;
k1=[];k2=[];h=[];s=[];
[filename,filepath]=uigetfile(*.txt,选择高程数据文件);
fid1=fopen(strcat(filepath,filename),rt);
if(fid1==-1)
msgbox(InputFileorPathisnotcorrect,Warning,warn);
return;
end
ed=fscanf(fid1,%f,1);
dd=fscanf(fid1,%f,1);
sd=ed+dd;
gd=fscanf(fid1,%f,1);
pn=fscanf(fid1,%f,sd);
h0=fscanf(fid1,%f,ed);
h0(dd+1:ed+dd)=h0(1:ed);
heightdiff=fscanf(fid1,%f,[4,gd]);
heightdiff=heightdiff;
k1=heightdiff(:,1);%起点
k2=heightdiff(:,2);%终点
k11=heightdiff(:,1);%起点
k12=heightdiff(:,2);%终点
h1=heightdiff(:,3);%高差
s=heightdiff(:,4);%距离
fclose(all);
%点号转换
[k1,k01]=chkdat(sd,pn,k1);
[k2,k02]=chkdat(sd,pn,k2);
h0(1:dd)=20000;
ie=0;
while(1)%计算近似高程
fork=1:gd
i=k1(k);
j=k2(k);
if(h0(i)1e4h0(j)1e4)
h0(j)=h0(i)+h1(k);
ie=ie+1;
end
if(h0(i)1e4h0(j)1e4)
h0(i)=h0(j)-h1(k);
ie=ie+1;
end
end
if(ie==dd)
break;
end
end
h0=reshape(h0,length(h0),1);
return
bm1函数(75页)
functionid=bm1(gd,dd,k1,k2)
%计算一维压缩存放的数组id
id=[];
fori=1:dd
k=i;
forj=1:gd
i1=k1(j);
i2=k2(j);
if(i1==ii2k)
k=i2;
end
if(i2==ii1k)
k=i1;
end
end
id(i)=k;
end
fori=2:dd
id(i)=id(i-1)+i-id(i)+1;
end
return
一维压缩存储法方程平差(76页)
globalpathnamefilename
globaledddsdpngdh0k1k2h1sdh;
p=1./s;
id=bm1(gd,dd,k1,k2);
mm=id(dd);
a(1:mm)=0;
b(1:dd)=0;
fork=1:gd%形成法方程
i=k1(k);
j=k2(k);
h1=h1(k)+h0(i)-h0(j);
if(i=dd)
ii=id(i)-i;
a(ii+i)=a(ii+i