2015-05-11 28 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

相关问题