2011-05-27 40 views
4

我試圖從Matlab(或Octave)中的數字矢量中刪除任何長度爲3或更長的序列。例如,給定的矢量數據集從Matlab/Octave中的矢量中識別(並刪除)序列

dataSet = [1 2 3 7 9 11 13 17 18 19 20 22 24 25 26 28 30 31]; 

除去長度爲3或更多的所有序列將產生prunedDataSet:

prunedDataSet = [7 9 11 13 22 28 30 31 ]; 

我可以蠻力一個解決方案,但我懷疑有一個更使用向量/矩陣操作簡潔(也許是高效)的方法,但是我總是對產生索引或索引值的東西感到困惑。建議?

這是我想出了強制的方法:

dataSet = [1 2 3 7 9 11 13 17 18 19 20 22 24 25 26 28 30 31]; 
benign = []; 
for i = 1:size(dataSet,2)-2; 
    if (dataSet(i) == (dataSet(i+1)-1) && dataSet(i) == dataSet(i+2)-2); 
     benign = [benign i ] ; 
    end; 
end; 

remove = []; 
for i = 1:size(benign,2); 
    remove = [remove benign(i) benign(i)+1 benign(i)+2 ]; 
end; 

remove = unique(remove); 

prunedDataSet = setdiff(dataSet, dataSet(remove)); 
+1

你需要更精確的瞭解你的意思是長度的_any序列有什麼解決方案3個_...你的意思是隻'K,K + 1,K + 2 '對於任何'k'還是可以'k,k-1,k-2'也包括在內?那麼'k,±m,k±2m'或者就此而言,像k,k^2,k^3或者k,k * a,k * a^2等幾何序列呢? – abcd 2011-05-28 01:02:48

+0

對不起,我認爲從dataSet/prunedDataSet明顯可見,並且我給出了「暴力方法」:k,k + 1,k + 2。 – jhfrontz 2011-05-30 00:54:09

+0

我明白你的例子。但是,不清楚的是第一行中的術語「任何序列」。無論如何,我想你在下面有很好的解決方案,所以不用擔心。 – abcd 2011-05-30 00:55:59

回答

6

下面是使用DIFFSTRFIND

%# define dataset 
dataSet = [1 2 3 7 9 11 13 17 18 19 20 22 24 25 26 28 30 31]; 

%# take the difference. Whatever is part of a sequence will have difference 1 
dds = diff(dataSet); 

%# sequences of 3 lead to two consecutive ones. Sequences of 4 are like two sequences of 3 
seqIdx = findstr(dds,[1 1]); 

%# remove start, start+1, start+2 
dataSet(bsxfun(@plus,seqIdx,[0;1;2])) = [] 
dataSet = 

    7  9 11 13 22 28 30 31 
4

下面是使用矢量矩陣符號的嘗試:

s1 = [(dataSet(1:end-1) == dataSet(2:end)-1), false]; 
s2 = [(dataSet(1:end-2) == dataSet(3:end)-2), false, false]; 
s3 = s1 & s2; 
s = s3 | [false, s3(1:end-1)] | [false, false, s3(1:end-2)]; 
dataSet(~s) 

的理念是:s1是所有職位如此,其中一些a出現在a+1之前。 s2對於a出現在a+2之前的兩個位置的所有倉位均爲真。然後s在滿足前面的條件時變爲真。然後,我們構建s,以便將每個真實值傳播給它的兩個後繼者。

最後,dataSet(~s)保留上述條件爲假的所有值,也就是說,它保留的數字不是3序列的一部分。