| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2539 人关注过本帖
标题:MATLAB编的道格拉斯普克抽稀函数,变量如何设置?
只看楼主 加入收藏
celery1001
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-10-23
收藏
 问题点数:0 回复次数:2 
MATLAB编的道格拉斯普克抽稀函数,变量如何设置?
我的抽稀数据是我随便用函数生成的,假如就是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里还有除了递归的其他方法,希望高手能指点一下。若改正后函数能运行正确,定将追加分数(全部分都给你也行),谢谢大家啦!帮帮我吧,我已经调了两个星期啦!
搜索更多相关主题的帖子: 普克 道格拉斯 MATLAB 变量 函数 
2008-10-27 15:14
celery1001
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-10-23
收藏
得分:0 
我把变量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];%把测线最后一点的点号放入抽稀点集中
%测线抽稀完
2008-10-27 21:01
celery1001
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-10-23
收藏
得分:0 
郁闷,怎么都没人理啊!
2008-10-28 22:11
快速回复:MATLAB编的道格拉斯普克抽稀函数,变量如何设置?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.052608 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved