![]() |
#2
celery10012008-10-27 21:01
我把变量D改掉了,好像变量问题没有了(或许暂时还没发现)。但以前的老问题又出现了(我编的所有递归程序都这样),递归次数老不够,但我已经把次数提高到2000次了,而我的试验数据只有101个点而已,怎么可能 超过呢。大侠们,快救救我吧!
我改过的程序: %采用道格拉斯-普克法(改进)对第j条测线进行抽稀 function c_dpr=dpr(A,B,emp_s,emp_e,k_dpr,xyz) %dpr,对当前测线进行道格拉斯-普克(改进)抽稀 %c_dpr,抽稀过后的点集在xyz矩阵中的点号 %A,当前抽稀线段的起点 %B,当前抽稀线段的末点 %k_dpr,道格拉斯垂距限值 %xyz,当前抽稀测线坐标矩阵 c_dpr(1)=[emp_s];%把测线始点的点号放入抽稀点集中 CAB(1,:)=[emp_s,A,B];%当前抽稀线段的大于阈值的最大垂距值点号及相应的始末点 D=B;%声明变量D,并赋予初值为当前抽稀线段的末点 if B-A>1 for rj=1:B-A-1 rd(rj)=norm(cross(xyz(A,:)-xyz(B,:),xyz(rj+A,:)-xyz(A,:)))/norm(xyz(A,:)-xyz(B,:));%逐点求AB之间的点到直线AB上的垂距 end [max_rd,max_ind]=max(rd);%取垂距最大值及其在垂距向量rd中的点号 maxid=max_ind+A;%垂距最大值在xyz中的点号 rd=zeros(1,1); else max_rd=0;%如果始末点之间没有点,就设其间的最大垂距为0 end if max_rd>k_dpr c_dpr=[c_dpr,maxid];%把最大垂距点的点号放入抽稀点集中 CAB=[CAB;maxid,A,B]; B=maxid; c_dpr=[c_dpr,dpr(A,B,emp_s,emp_e,k_dpr,xyz)]; else A=B; [size_m,size_n]=size(c_dpr); for i_size=1:size_m;%特征点矩阵的第一列,即特征点点号 if CAB(i_size,1)==B B=CAB(i_size,3); end end if B<emp_e c_dpr=[c_dpr,dpr(A,B,emp_s,emp_e,k_dpr,xyz)];%当上一末点小于测线末点,且上一最大垂距小于限值时,以上一末点B为始点,上上末点D为末点 end end c_dpr=[c_dpr,emp_e];%把测线最后一点的点号放入抽稀点集中 %测线抽稀完 |
我的抽稀数据是我随便用函数生成的,假如就是x=[-10:.2:10];y=[-10:.2:10];z=sin(.7*x)+cos(.9*y);我的抽稀思想是:(1)给定N个数据点,计算中间点到始末点连线的距离,若最大距离值大于给定阈值,则记录此点(特征点),然后把点列分成前后段,同时调用此函数。最后得到的是曲线的特征点和始末点。我的抽稀函数如下:
%采用道格拉斯-普克法(改进)对第j条测线进行抽稀
function c_dpr=dpr(A,B,emp_s,emp_e,k_dpr,xyz)
%dpr,对当前测线进行道格拉斯-普克(改进)抽稀
%c_dpr,抽稀过后的点集在xyz矩阵中的点号
%A,当前抽稀线段的起点
%B,当前抽稀线段的末点
%k_dpr,道格拉斯垂距限值
%xyz,当前抽稀测线坐标矩阵
c_dpr(1)=[emp_s];%把测线始点的点号放入抽稀点集中
D=B;%声明变量D,并赋予初值为当前抽稀线段的末点
if B-A>1
for rj=1:B-A-1
rd(rj)=norm(cross(xyz(A,:)-xyz(B,:),xyz(rj+A,:)-xyz(A,:)))/norm(xyz(A,:)-xyz(B,:));%逐点求AB之间的点到直线AB上的垂距
end
[max_rd,max_ind]=max(rd);%取垂距最大值及其在垂距向量rd中的点号
maxid=max_ind+A;%垂距最大值在xyz中的点号
rd=zeros(1,1);
else
max_rd=0;%如果始末点之间没有点,就设其间的最大垂距为0
end
if max_rd>k_dpr
B=maxid;
D=B;
c_dpr=[c_dpr,B];%把最大垂距点的点号放入抽稀点集中
c_dpr=[c_dpr,dpr(A,B,emp_s,emp_e,k_dpr,xyz)];
else
if D<emp_e
c_dpr=[c_dpr,dpr(B,D,emp_s,emp_e,k_dpr,xyz)];%当上一末点小于测线末点,且上一最大垂距小于限值时,以上一末点B为始点,上上末点D为末点
end
end
c_dpr=[c_dpr,emp_e];%把测线最后一点的点号放入抽稀点集中
%测线抽稀完
其中的变量D的赋值有错误,中间老变,但我不知道应该怎么设置,或许在MATLAB里还有除了递归的其他方法,希望高手能指点一下。若改正后函数能运行正确,定将追加分数(全部分都给你也行),谢谢大家啦!帮帮我吧,我已经调了两个星期啦!