查看您的意見,希望查找具有三個或更多連續日期的行。基本算法是我們有一個滑動窗口大小爲3.我們檢查一下最後一個點和第一個點之間的差異是否爲。例如,694160和694158之間的差值爲2,這表示連續3天。每當我們看到差異爲2時,這意味着這三行表示連續運行。
我們可以使用im2col
函數來實現這個滑動窗口機制。假設您安裝了圖像處理工具箱(十字指紋)。然後,我們可以將我們的日期數組分割成3個重疊集。然後,我們實現我們上面的邏輯並查看哪些區域的差值爲2.此時,這些位置表示開始連續運行的位置。請記住,如果您想要捕獲連續運行的> 3
,我們將重複運行。例如,如果我們運行了4(假設從694158到694162),我們將在1到3和2到4的位置運行。然後我們需要消除重複,以便最終捕獲我們獨特的行。毫不遲疑,下面是一些例子的代碼。這就是我要使用的例子。假設A
是您從矩陣中提取的日期列。我在這裏人爲地創建了它,讓這個例子自成一體。
A = [(694158:694160)'; 694161; 694179; 694180; 694183; (694160:694162)';(695000:695005)'];
A =
694158
694159
694160
694161
694179
694180
694183
694160
694161
694162
695000
695001
695002
695003
695004
695005
現在,這裏是我實現的邏輯:
%//Place our array into neighbourhoods of 3
columns = im2col(A, [3, 1]);
%//Find the difference
diffColumns = bsxfun(@minus, columns, columns(1,:));
%// Check to see which columns have a max difference of two
maxDiff = find(diffColumns(3,:) == 2);
%//Find those rows that satisfy our condition
rowsNonUnique = arrayfun(@(x) x:x+2, maxDiff, 'UniformOutput', false);
% // Eliminate duplicates and transform back
rowsFinal = unique(cell2mat(rowsNonUnique));
rowsFinal =
Columns 1 through 12
1 2 3 4 8 9 10 11 12 13 14 15
Column 13
16
你可以從數據中看到的,我們需要排1-4和8-16,因爲它與我們所知道的是連續的同意至少3行或更多的行。
現在,如果要附加給你的矩陣,你有以上,你可以做到以下幾點,假設你的數據被存儲在變量matrix
indicator = zeros(size(matrix,1),1);
indicator(rowsFinal) = 1;
matrix(:,6) = indicator;
這將創建一個第六列,什麼這會告訴你任何值爲1
的值意味着這是你需要考慮的一行,而0
表示你跳過它。
祝你好運!
你是什麼意思**連續**?你是指的序列日期數字,看看他們是否遵循序列?例如,694158,654159和694160會被認爲是連續三天的序列嗎?看到694160不在列中,這隻能算作連續兩天嗎? – rayryeng
是的,我希望能夠查看日期列,併爲整個矩陣選取具有3天(或更長)序列(例如694158,654159和694160)的行 – climatefreak
這並不是那麼糟糕。給我5分鐘。 – rayryeng