2015-05-11 53 views
1

我會直接跳到一個最小的例子,因爲我覺得很難把它放在單詞中。我下面舉個例子:基於MATLAB中的兩個日期時間數組的邏輯索引數據

Data.Startdate=[datetime(2000,1,1,0,0,0) datetime(2000,1,2,0,0,0) datetime(2000,1,3,0,0,0) datetime(2000,1,4,0,0,0)]; 
Data.Enddate=[datetime(2000,1,1,24,0,0) datetime(2000,1,2,24,0,0) datetime(2000,1,3,24,0,0) datetime(2000,1,4,24,0,0)]; 
Data.Value=[0.5 0.1 0.2 0.4]; 
Event_start=[datetime(2000,1,1,12,20,0) datetime(2000,1,1,16,0,0) datetime(2000,1,4,8,0,0)]; 
Event_end=[datetime(2000,1,1,14,20,0) datetime(2000,1,1,23,0,0) datetime(2000,1,4,16,0,0)]; 

我想要做的就是添加一個標誌,數據結構(比如1)如果Data.Startdate和Data.Enddate之間的任何時間落在Event_start和Event_end之間。在上面的例子中,Data.Flag的值爲1 0 0 1,因爲從Event_start和Event_end向量可以看到1月1日和1月4日有事件發生。這個想法是我將使用這個標誌來進一步處理數據。

我相信這很簡單,但希望您能給予的幫助。

回答

2

我會的日期轉換爲使用datenum號碼,然後允許使用bsxfun還算方便比較:

isStartBeforeEvent = bsxfun(@gt,datenum(Event_start)',datenum(Data.Startdate)); 
isEndAfterEvent = bsxfun(@lt,datenum(Event_end)',datenum(Data.Enddate)); 

flag = any(isStartBeforeEvent & isEndAfterEvent, 1) 
+0

感謝您的回答,但什麼嗨如果Event_start和Data.Startdate有不同的尺寸是多少?對於在我原來的帖子中沒有澄清這一點抱歉。 – user1912925

+0

@ user1912925:只要兩者都是行向量,我的代碼就不會在意(因爲你的例子有不同數量的事件和日期,我甚至可以測試它)。 'bsxfun'行將所有開始/結束進行比較,創建兩個nEvents-by-mDates數組以供進一步處理。 – Jonas

+0

奇怪我得到bsxfun錯誤「兩個輸入數組的非單獨維度必須相互匹配」(在我的「真實案例」中Data.Startdate是1 x 863,Event_start是340 x 1或1 x 340轉換後就像你在例子中做的那樣)。我可以看到我的真實案例和上面的最小示例之間沒有其他區別,它確實可以使用您的解決方案。 – user1912925

相關問題