注册 登录
编程论坛 Matlab

MATLAB编的道格拉斯普克抽稀函数,变量如何设置?

celery1001 发布于 2008-10-27 15:14, 2547 次点击
我的抽稀数据是我随便用函数生成的,假如就是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里还有除了递归的其他方法,希望高手能指点一下。若改正后函数能运行正确,定将追加分数(全部分都给你也行),谢谢大家啦!帮帮我吧,我已经调了两个星期啦!
2 回复
#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];%把测线最后一点的点号放入抽稀点集中
%测线抽稀完
#3
celery10012008-10-28 22:11
郁闷,怎么都没人理啊!
1