我有一个Matlab时间序列数据集,它由一个只能是1或0的信号组成。除了更改的值之外,我怎样才能除掉所有值? 例如:
1
1
1
0
1
0
0
0
理想情况下应该导致
1
0
1
0
同时保持正确的时间值。 事实是,我需要找到信号的频率。应该从0-> 1到下一次0-> 1的时间测量时间。最小的时间/最高频率是我最终需要的。
谢谢!
答案 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)
您可以使用diff
和logical
将结果保存为逻辑数组,用作数据中的后续索引过滤器(例如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)