我有一个有趣的问题,涉及从矩阵中取出最后day
并找到其last month
天。例如,如果今天的日期是10月10日至2011年10月,您尝试搜索2011年9月10日或第一天< 2011年9月10日在矩阵中。
Matrix有多个ID,最后交易日期可能不同。 需要矢量化解决方案。谢谢!
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行)
一旦我得到每个ID的最后日期,我需要获得exact_day_lastmonth。在此之后,我需要在当天或离它最近的那天获取数据(应该是< 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
答案 0 :(得分:0)
除非您想冒险使用复杂索引的大型数组,否则我认为循环是可行的。
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