清理MATLAB时间序列数据

时间:2016-03-15 15:33:35

标签: matlab time-series

我有一个Matlab时间序列数据集,它由一个只能是1或0的信号组成。除了更改的值之外,我怎样才能除掉所有值? 例如:

1
1
1
0
1
0
0
0

理想情况下应该导致

1
0
1
0

同时保持正确的时间值。 事实是,我需要找到信号的频率。应该从0-> 1到下一次0-> 1的时间测量时间。最小的时间/最高频率是我最终需要的。

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用getsamples方法获取包含原始样本子集的时间序列。仍然是为了识别时间序列已更改的索引,为此您可以使用diff和逻辑索引:

ts = timeseries([1 1 1 0 1 0 0 0],1:8)
ts.getsamples([true;squeeze(diff(ts.Data)) ~= 0])

答案 1 :(得分:3)

diff进行简单而巧妙的调用就足够了:

>> A = [1; 1; 1; 0; 1; 0; 0; 0];
>> B = A(diff([-Inf; A]) ~= 0)

B =

     1
     0
     1
     0

代码非常简单。 diff在数组中找到差异对。具体而言,给定数组A,输出具有以下结构:

B = [A(2) - A(1), A(3) - A(2), ..., A(N) - A(N-1)];

N是信号的总长度。这导致N-1长度信号。因此,您可以使用的技巧是使用A(或某些高非零值)附加数组-Inf,以便在找到此附加数组的第一个元素与真实数组的实际第一个元素,您将获得一些非零更改。这是在diff([-Inf; A])注册的。接下来你要检查的是检查差异非零的位置。每当存在非零差异时,这是您要保留的位置,因为发生了变化。这会生成一个logical数组,因此最后一步是使用它来索引数组A,从而得到结果。

这只会提取出你需要的信号。如果您想在独特元素之间提取时间,假设您有一些时间向量t,只要您的信号存储在A中。你首先将逻辑向量记录在一个单独的变量中,然后索引到你的时间数组和信号数组中以提取出你需要的东西(来自用户dfri的原始想法):

ind = diff([-Inf; A]) ~= 0;
times = t(ind);
B = A(ind);

答案 2 :(得分:2)

您可以使用difflogical将结果保存为逻辑数组,用作数据中的后续索引过滤器(例如t表示时间和{{1}对于布尔值))

y

以下示例的结果如下

%// example
t = 0:0.01:0.07;
y = [1,1,1,0,1,0,0,0];

%// find indices to keep
keep = [true logical(diff(y))];

%// truncated data
tTrunc = t(keep)
yTrunc = y(keep)