Сопоставить число (дату) в матрице - Matlab

У меня есть интересная проблема, которая включает в себя принятие последнего day из матрицы и найти его last month день. Например, если сегодняшняя дата - 10 октября 2011 г., вы пытаетесь найти в матрице 10 сентября 2011 г. или первый день <10 сентября 2011 г.

Матрица имеет несколько идентификаторов, и последние торговые даты могут не совпадать. Векторизованное решение желательно. Спасибо!

mat = [
 1000 734507 11 ; 1000 734508 12 ; 1000 734509 13 ; 
 2001 734507 21 ; 2001 734508 22 ; 2001 734513 23 ; 2001 734516 25 ;
 1000 734536 14 ; 1000 734537 15 ; 1000 734538 16 ; 
 2001 734536 26 ; 2001 734537 27 ; 2001 734544 28 ; 2001 734545 29;2001 734546 30
];

% datestr(mat(:,2))
[~,m,~] = unique(mat(:,1), 'rows', 'last') ;
lastDay = mat(m,;) ;

Пробовал с помощью addtodate чтобы получить дату последнего месяца здесь, но это не удается (более 1 строки)

Как только я получу последние даты для каждого идентификатора, мне нужно получить точный_день_месяца. После этого мне нужно получить данные об этом дне ИЛИ ближайшем к нему дне (должно быть < exact_day_lastmonth).

Ответ:

current_lastdays = [1000 734538 16 ;  2001 734546 30] ; % 4-Feb-2011, 12-Feb-2011
matching_lastmon = [1000 734507 11 ;  2001 734513 23] ; % 4-Jan-2011, 10-Jan-2011

1 ответ

Решение

Если вы не хотите рисковать довольно большими массивами со сложной индексацией, я думаю, что цикл - это путь.

mat = [ 1000 734507 11 ; 1000 734508 12 ; 1000 734509 13 ; 
        2001 734507 21 ; 2001 734508 22 ; 2001 734513 23 ; 2001 734516 25 ;
        1000 734536 14 ; 1000 734537 15 ; 1000 734538 16 ; 
2001 734536 26 ; 2001 734537 27 ; 2001 734544 28 ;2001 734545 29;2001 734546 30];

%# datestr(mat(:,2))
[~,m,~] = unique(mat(:,1), 'rows', 'last') ;
lastDay = mat(m,;) ;

matching_lastmon = lastDay; %# initialize matching_lastmon
oneMonthBefore = datenum(bsxfun(@minus,datevec(lastDay(:,2)),[0,1,0,0,0,0]));

for iDay = 1:size(lastDay,1)
    %# the following assumes that the array `mat` is sorted within each ID (or globally sorted by date)

    idx = find(mat(:,1)==lastDay(iDay,1) & mat(:,2) <= oneMothBefore(iDay),1,'last')

    if isempty(idx)
        matching_lastmon(iDay,2:3) = NaN;
    else
        matching_lastmon(iDay,:) = mat(idx,:);
    end


end
Другие вопросы по тегам