在不同长度的数组中找到相同的日期时间

时间:2013-06-12 18:32:47

标签: arrays matlab date

考虑以下朱利安日期数组

Jday1 = datenum('2011-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM');
Jday2 = datenum('2011-04-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM');
Jday3 = datenum('2011-02-06 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-12-31 22:00','yyyy-mm-dd HH:MM');

这些都是不同的长度,并且在其中有不同的时间。

如何才能找到3个数组中哪些日期相同,即返回所有数组之间的一致dateTime的索引?

我知道如果它们的大小相同,我可以使用strcmp,但如果它们的长度不同,我会怎么做?此外,strcmp在这里是一个问题,因为数组的数量为3而不是2。

2 个答案:

答案 0 :(得分:4)

使用intersect

common_dates = intersect(intersect(Jday1, Jday2), Jday3);

或者如果您还需要索引(基于@Robert P.的评论,请注意内部intersect位置的变化):

[common_dates, idx] = intersect(Jday1, intersect(Jday2, Jday3));

<强>更新

如果要交叉多个数组,请编写一个小函数来处理作业:

function varargout = intersectn(varargin)
narginchk(2, Inf);
nargoutchk(0, 2);
x = varargin{nargin}; 
for i = nargin-1:-1:1
    [x, idx] = intersect(varargin{i}, x); 
end
if nargout > 1, varargout{2} = idx; end
if nargout > 0, varargout{1} = x; else disp(x); end

答案 1 :(得分:0)

由于您将数组存储为datenums而不是字符串,因此您只需将它们与Compare = (Jday1 == Jday2)进行比较,依此类推。这仅适用于两个向量长度相同的情况。

如果向量具有不同的长度,则可以使用Compare = ismember(Jday1, Jday2)返回与Jday1大小相同的数组,并在每个索引i处返回1(true){{1}可以在集合Jday1(i)中找到。

Documentation on ismember can be found here

最后,如果您只想返回一个列表等于另一个列表的索引,请尝试Jday2