我有一個Matlab時間序列數據集,其中包含一個信號,只能是1或0.我怎樣才能擺脫除了變化的所有值? 例如:清理MATLAB時間序列數據
1
1
1
0
1
0
0
0
應該理想地導致
1
0
1
0
,同時保持正確的時間值,以及課程。事情是,我需要找到信號的頻率。時間應該從0-> 1到下一次出現0-> 1。最小的時間/最高的頻率是我最終需要的。
謝謝!
我有一個Matlab時間序列數據集,其中包含一個信號,只能是1或0.我怎樣才能擺脫除了變化的所有值? 例如:清理MATLAB時間序列數據
1
1
1
0
1
0
0
0
應該理想地導致
1
0
1
0
,同時保持正確的時間值,以及課程。事情是,我需要找到信號的頻率。時間應該從0-> 1到下一次出現0-> 1。最小的時間/最高的頻率是我最終需要的。
謝謝!
您可以使用getsamples
方法獲取包含原始樣本子集的時間序列。遺體辨認出時間序列改變了指數,這個目的,你可以使用diff
和邏輯索引:
ts = timeseries([1 1 1 0 1 0 0 0],1:8)
ts.getsamples([true;squeeze(diff(ts.Data)) ~= 0])
向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);
您可以使用diff
並logical
將結果保存爲邏輯陣列,在你的數據(比如t
時間和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)
的結果爲實施例中使用作爲後續索引濾波器如下
tTrunc =
0 0.0300 0.0400 0.0500
yTrunc =
1 0 1 0
當讀取你的問題我假設你有一個'timeseries'對象,其他兩個答案,假設你的輸入數據是一個向量。什麼是對的? – Daniel
你說得對。我正在從simulink仿真中獲取時間序列對象。我嘗試使用下面描述的diff方法,但到目前爲止,還是無法使其工作。我會嘗試接下來的getsamples方法:) – Jonnnny