文章目录
通过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的值如下图所示
可见对于不同的数组,还需要通过添加不同的条件来加以限定哈。