2016-03-15 190 views
1

我有一個Matlab時間序列數據集,其中包含一個信號,只能是1或0.我怎樣才能擺脫除了變化的所有值? 例如:清理MATLAB時間序列數據

1 
1 
1 
0 
1 
0 
0 
0 

應該理想地導致

1 
0 
1 
0 

,同時保持正確的時間值,以及課程。事情是,我需要找到信號的頻率。時間應該從0-> 1到下一次出現0-> 1。最小的時間/最高的頻率是我最終需要的。

謝謝!

+1

當讀取你的問題我假設你有一個'timeseries'對象,其他兩個答案,假設你的輸入數據是一個向量。什麼是對的? – Daniel

+0

你說得對。我正在從simulink仿真中獲取時間序列對象。我嘗試使用下面描述的diff方法,但到目前爲止,還是無法使其工作。我會嘗試接下來的getsamples方法:) – Jonnnny

回答

4

您可以使用getsamples方法獲取包含原始樣本子集的時間序列。遺體辨認出時間序列改變了指數,這個目的,你可以使用diff和邏輯索引:

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

您的解決方案几乎適用於我! 我必須改變你的代碼: ts_short = getsamples(ts,squeeze(diff(ts.Data))〜= 0); 然後,它的工作原理除了數據集中的第一次更改,我認爲這是因爲數組的第一個點都是一樣的? – Jonnnny

+0

@Jonnnny我的解決方案出了什麼問題?然後我可以理解你需要什麼。 – Daniel

+0

好吧,我只錯過了'真正'的需要。現在完美運作。謝謝! 使用您的解決方案,生成的陣列與我原來的尺寸完全一樣。不知道爲什麼;-) – Jonnnny

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); 
+0

如果你想讓第一個元素爲真,那麼爲什麼不簡單地使用'B = A([true; diff(A)〜= 0])?兩者對於這個應用程序都是完全正確的,但我認爲這樣更容易理解和解釋。 – Daniel

+1

@Daniel這實際上是一個很好的觀點,但這意味着它將與用戶dfri的答案類似。我將以這種方式表現出獨特性。儘管如此,謝謝你的建議! – rayryeng

2

您可以使用difflogical將結果保存爲邏輯陣列,在你的數據(比如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 
+0

這也是另一種使用'diff'的好方法。 +1。 – rayryeng

+1

@rayryeng從我們的答案中可以看出,'差異'是要走的路,但是你略微擊敗了我,+1! (或者,正如丹尼爾補充的那樣,'getsamples' :)) – dfri

+1

當第一個元素爲0時,返回錯誤的結果。'keep = [true logical(diff(y))];' – Daniel