回 帖 发 新 帖 刷新版面

主题:[讨论]求助循环方面的问题,有代码

遇到一个新问题,先描述如下:
自定义了一个函数,其功能是可以对输入的序列求出其拐点,然后以拐点为界,将序列一分为二。该部分代码已正确写出了。
问题是在主函数中,我需要判断分成的这两部分的长度是否小于一个已给定的值,若不小于,将调用上面自定义的函数继续分裂数据,直到所有的序列的长度都小于这个已给定的值,问题就出现在这个循环中,有兴趣的话我可以把自己写的代码发出来,希望热心人可以指出我的错误,或者提出更好的解决办法,先谢过了。
MinLength=4;%时间序列的最小分裂长度阈值。
S=[ 2 3 2 4 6 7 9 2 1 3]
D=Segment(S,MinLength)
D{1,:}
D{2,:}%查看一下D中的元素具体内容。
w=1;
Q=cell(2,1000);
for k=1:4
    if(length(D{1,k})>0)%把非零元素即不需要再分裂的序列存入D的第三行。
        
        Q{1,w}=D{1,k};%Q第1行用来存不需要再分裂的序列,每次的都按顺序加到后面。能实现吗????、、
        D{1,k}=[];%把D的第1行元素清空。方便下次循环时继续用,而不至于重复造成混乱。
        w=w+1;
    end
end

for m=1:4
        if(length(D{2,m})>0)
        Q{2,m}=D{2,m};
        D{2,m}=[];%把D的第2行元素清空。方便下次循环时继续用,而不至于重复造成混乱。
        
        for k=1:4
            if(length(D{1,k})>0)%把非零元素即不需要再分裂的序列存入D的第三行。
        
                Q{1,w}=D{1,k};%Q第1行用来存不需要再分裂的序列,每次的都按顺序加到后面。能实现吗????、、
                D{1,k}=[];%把D的第1行元素清空。方便下次循环时继续用,而不至于重复造成混乱。
                w=w+1;
            end
        end
        [D Sd t]=Segment(Q{2,m},MinLength)
    end
end
%错误了,主要是length(D{2,m}),一次循环后会冲掉以前的,想办法解决啊??????????????
可以第一次调用自定义的函数,但以后循环就不行了。
[D Sd t]=Segment(S,MinLength)是我自定义的函数,已经编写正常了,其中D是cell数组第一行存小于分裂阈值的序列,第二行存需要再次分裂的序列。问题就出在这个循环上了[em18][em18]

回复列表 (共2个回复)

沙发

先不说你说的“拐点”的具体含义(是对应连续函数中的一阶导数为0?还是二阶导数为0的点呢?),但无论你的拐点是什么,你为什么不先把你序列平分成n段,使每段略小于你规定的长度,在每段中求出拐点再合并

板凳

楼主你的含义“我需要判断分成的这两部分的长度是否小于一个已给定的值,若不小于,将调用上面自定义的函数继续分裂数据,直到所有的序列的长度都小于这个已给定的值”

1.对任何一序列,首先,判断维数是否小于等于4;大于4则调用“[D Sd t]=Segment(S,MinLength)”你的程序是先分裂序列,再判断分裂后的序列是否小于4,不合理。

2.Q=cell(2,1000);用来存放分裂后的大序列,不合理。完全可以测试分裂后两序列的长度,再生成存放序列的长度。

3.Q{1,w}=D{1,k};%Q第1行用来存不需要再分裂的序列,每次的都按顺序加到后面。能实现?
思维混乱。你可能想套两个数交换位置的算法,没有必要。
实现上述过程:可以先测试是否要分裂,如要分裂,则测试分裂后有几个序列,几个序列按循环生成即可。

个人观点,如不对,请指出。

我来回复

您尚未登录,请登录后再回复。点此登录或注册