2014-06-10 18 views
0

我目前正在尋找一種方法來使用Matlab來幫助定義一個特定站點的熱波事件。就我的情況而言,熱浪是高溫或低溫偏離正常值95%(「放鬆」熱浪)或99%(「嚴格」熱浪)的地方。尋找連續的日子來定義一個事件

我使用了一個.csv文件,每天有最高和最低溫度,以及相應的偏離。從這裏我能夠將數據分解成我想要的時間範圍,然後計算閾值。有四個不同的閾值--95百分位的最低和最高溫度偏差以及99百分位的最低和最高溫度偏離。

目前我有四個矩陣,每個閾值都有數據。下面是滿足的最大溫度離開閾值(M1)的矩陣的一小部分:

694158 99 14 64 1 
694159 99 13 68 5 
694179 98 13 63 1 
694180 98 14 74 12 
694183 100 16 70 8 

第一列表示在序列日期數和列的其餘的溫度信息(最大,最大出發,分鐘,分鐘出發)。

所以,這裏是我的問題:我找不到一個方法來查看連續日期數字,看看是否有連續三天(或更多)。

我可以在網上找到的最佳幫助是this mathworks post,但該解決方案不會將任何信息附加到矩陣中。

如果有人能指向我正確的方向,或指向我的資源來幫助我,我會非常感激!

在此先感謝。

+1

你是什麼意思**連續**?你是指的序列日期數字,看看他們是否遵循序列?例如,694158,654159和694160會被認爲是連續三天的序列嗎?看到694160不在列中,這隻能算作連續兩天嗎? – rayryeng

+0

是的,我希望能夠查看日期列,併爲整個矩陣選取具有3天(或更長)序列(例如694158,654159和694160)的行 – climatefreak

+0

這並不是那麼糟糕。給我5分鐘。 – rayryeng

回答

0

查看您的意見,希望查找具有三個或更多連續日期的行。基本算法是我們有一個滑動窗口大小爲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表示你跳過它。

祝你好運!

+0

非常好,非常感謝! – climatefreak

0

在這裏你去,這應該做到這一點:

count = 0; 
for ii = 2:size(tempArray, 1) 
    if tempArray(ii, 1) == (tempArray(ii-1, 1)+1) 
     count = count + 1; 
     if count >= 3; 
      tempArray(ii-2:ii, 6) = 1; 
     end 
    else 
     count = 0; 
    end 
end 
%// This last line should work... but I haven't tested it. 
consecArray = tempArray(find(tempArray(:,6)==1)); 

通過您的陣列中的每個元素的代碼循環,將它與以前的,如果三連勝被發現是連續的,套第六行爲1.因此,在運行此腳本之後,您將擁有一個矩陣,其中連續三天或更多天的一部分中的每一行都會有一個值表示同樣多的值。

1

M表示您的矩陣,並且n是您想要的連續最少天數(在您的示例中爲3)。然後:

ind = find(conv(double(diff(M(:,1))==1), ones(n-1,1))==n-1)-n+2; %// starts 
ind = bsxfun(@plus, ind, 0:n-1); %// fill n-1 subsequent row indices 
ind = unique(ind(:)); %// make unique 
result = M(ind,:); %// keep only those rows 
+0

嗨,我知道你在發佈這個答案後就問這種方式,但我認爲這會比開始一個新問題更好。有沒有辦法修改這段代碼來查找_maximum_連續天數?因此,例如,如果我在矩陣中連續3天的日事件,我是否可以修改此代碼以隔離僅3天的事件?或2天的事件?謝謝! – climatefreak

+0

@climatefreak不知道你的意思......此外,這似乎真的是一個新問題。我建議你把它作爲一個新問題發佈,包括一個帶輸入和期望輸出的例子 –

+0

好的,謝謝你的輸入! – climatefreak