2013-06-12 3 views
2

Рассмотрим следующие массивы Юлиана датынайти тот же DateTime в массивы различной длины

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 массивах, т. Е. Вернуть индекс согласованной даты времени между всеми массивами?

Я знаю, что могу использовать strcmp, если бы они были одного размера, но что бы я сделал, если они имеют разную длину, как в примере? Кроме того, проблема strcmp возникла бы из-за количества массивов, равных 3, а не 2.

ответ

4

Использование intersect:

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

или если необходимо также индексы (на основе ниже замечанием @Robert P., обратите внимание на изменение в положении внутренней intersect):

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

UPDATE

Если у вас есть несколько массивов для пересечения, напишите небольшую функцию для обработки t он работа:

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

+1, 2 секунды впереди меня ... = P Вы можете использовать дополнительные выходы пересекаются, чтобы получить индексы в Jday3 .. –

+0

Великого, спасибо. Итак, если бы вы сказали еще один вектор Jday, вы могли бы использовать ту же процедуру, что и [common_dates, idx] = пересекаться (пересекаться (пересекаться (Jday1, Jday2), Jday3), Jday4); Некоторая функция, подобная функции слияния в R, здесь была бы большой. – KatyB

+0

@ Kate Я добавил небольшую функцию, которая может обрабатывать неограниченное количество пересечений. Вы можете добавить дополнительные функции и настройки в функцию (проверьте тип входных параметров, ...) – Bee

0

Поскольку вы храните свои массивы как данные, а не строки, вы можете просто сравнить их с Compare = (Jday1 == Jday2) и так далее. Это работает только в том случае, если два вектора имеют одинаковую длину.

Если векторы имеют разную длину, можно использовать Compare = ismember(Jday1, Jday2) возвращает массив того же размера, как Jday1 с 1 (истина) на каждом индексе i, где Jday1(i) можно найти в наборе Jday2.

Documentation on ismember can be found here

Наконец, если вы просто хотите вернуть индексы, где один список равняется другому, попробуйте find(ismember(Jday1, Jday2)).

Смежные вопросы