我需要報告數組中的序列號。例如對於:查找數組中的序列號
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])
一個序列。
我怎樣才能找到有多少個數字序列呢?
我需要報告數組中的序列號。例如對於:查找數組中的序列號
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])
一個序列。
我怎樣才能找到有多少個數字序列呢?
如果你只有可能的元素值的A
幾號(如在問題那裏只有三個值,-1
,0
和1
的例子),你可以遍歷這些並使用以下幾個步驟得到不同序列的長度。
下面是一個例子檢查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
您可以使用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)
的StackOverflow是不是一個代碼編寫的服務。請閱讀[提問一個好問題的指南](http://tinyurl.com/so-hints)並顯示[你嘗試過的](http://whatyouhavetried.com)。您可能還想解釋您正在使用的編程語言。 – 2013-02-11 09:42:08
我正在使用Matlab,我嘗試使用ismember函數,以便我可以在目標數組中找到一組,但它沒有給我嵌入在我的目標數組中的序列數量。有沒有一個特定的功能,我失蹤了? – user2060814 2013-02-11 10:06:29
爲什麼不循環訪問數組並跟蹤進度狀態? – 2013-02-11 10:35:27