2013-02-11 60 views
1

我需要報告數組中的序列號。例如對於:查找數組中的序列號

A=[ 1 1 -1 -1 -1 -1 -1 0 1 -1 -1 -1 -1 1 1 -1 -1 1 0 1 1]

,我必須報告的次數#一批來連續,例如,中

5 -1s ([-1 -1 -1 -1 -1])一個序列和

4 -1s ([-1 -1 -1 -1])一個序列。

我怎樣才能找到有多少個數字序列呢?

+0

的StackOverflow是不是一個代碼編寫的服務。請閱讀[提問一個好問題的指南](http://tinyurl.com/so-hints)並顯示[你嘗試過的](http://whatyouhavetried.com)。您可能還想解釋您正在使用的編程語言。 – 2013-02-11 09:42:08

+0

我正在使用Matlab,我嘗試使用ismember函數,以便我可以在目標數組中找到一組,但它沒有給我嵌入在我的目標數組中的序列數量。有沒有一個特定的功能,我失蹤了? – user2060814 2013-02-11 10:06:29

+0

爲什麼不循環訪問數組並跟蹤進度狀態? – 2013-02-11 10:35:27

回答

0

如果你只有可能的元素值的A幾號(如在問題那裏只有三個值,-101的例子),你可以遍歷這些並使用以下幾個步驟得到不同序列的長度。

下面是一個例子檢查A == -1

A = [1 1 -1 -1 -1 -1 -1 0 1 -1 -1 -1 -1 1 1 -1 -1 1 0 1 1]; 
B = [0, A==-1, 0]; 

使用diff()功能查找每個序列的開始和結束,並減去兩個向量來獲取序列的長度。

>> C = find(diff(B)==-1)-find(diff(B)==1) 

C = 

    5  4  2 

在這裏我們可以看到,有長度五分之一的序列,其次是長度爲4的一個和lenth兩者之一。我們也可以使用histc()來獲得矢量中這些長度的頻率。

>> D = histc(C,1:max(C)) 

D = 

    0  1  0  1  1 

重複的步驟,使用另一個值,例如檢查B = [0, A==1, 0];給我們:

C = 

    2  1  2  1  2 

D = 

    2  3 
1

您可以使用run-length encoding執行此任務

function [rl data] = runLength(vec) 
% run length encoding for vector vec 
rl = (find(vec ~= [vec(2:end), vec(end)+1])); 
data = vec(rl); 
rl(2:end) = rl(2:end) - rl(1:end-1); 

應用遊程編碼A

>> [rl data] = runLength(A) 
rl = 
    [ 2 5 1 1 4 2 2 1 1 2 ] 
data = 
    [ 1 -1 0 1 -1 1 -1 1 0 1 ] 

所以,如果你有興趣的長度序列號>n所有你需要的是

>> nnz(rl > n)