通过Matlab粗测数组的周期

通过Matlab获得数组的周期

在做实验的时候经常会遇到一些周期性现象,当实验数据比较多的时候手动判断周期太过麻烦,比如有一群下面这样的沙雕数组
某沙雕序列
最简单粗暴的想法便是选取某个值对数组进行等间隔采样。如果此时的值正好是这个数组的周期,那么采集的数据必然相差较小,即方差较小。也就是说方差最小时的值便是该数组的周期。

%%获取数组的周期
function T = hiGetT(seq)
lenQ = length(seq);
tVar = realmax;
for t = 2:lenQ/4
    varT = zeros(t-1,1);%当前周期不同起始点的方差
    for i = 1:t-1
   		samp = seq(i:t:lenQ);%采样序列
        varT(i) = var(samp);
    end
    if mean(varT)<tVar
        tVar = mean(varT);
        T = t;
    end
end
end

结果为219,手动量取的某个值为222,效果还是不错的,可见这种思路可行,不过速度比较慢,可能是在数组中间隔地选取采样点造成的。

改进

对于**samp = seq(i:t:lenQ)**这条语句,其实很类似于将数组整型成矩阵,而且,对于某一相同的采样周期,不同初始点采集的数据个数是相同的。
则改进后的代码如下

function [T] = getT(seq)
%获取一个序列的周期
lenQ = length(seq);
tVar = zeros(floor(lenQ/4),1);%不同试验周期的方差
tVar(1) = realmax;
for t = 2:lenQ/4
    cols = floor(lenQ/t);%采样点个数
    mat = reshape(seq(1:t*cols),t,cols);%整型为t行cols列
    tVar = mean(var(mat,0,2));%求取每一行的方差,并取平均值
end
[~,T] = min(tVar);
end

tictoc一下,时间从0.6秒变为0.1秒,快了不少。
然而,通过新建一个三角函数y = sin(x/100) 来检测该方法时却出现了问题,得到其周期为1257,正好是2倍周期(虽说2倍周期也是周期),其 tVar的值如下图所示
在这里插入图片描述
可见对于不同的数组,还需要通过添加不同的条件来加以限定哈。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值