【问题标题】:match a number (date) in a matrix - Matlab匹配矩阵中的数字(日期) - Matlab
【发布时间】:2011-10-10 17:08:17
【问题描述】:

我有一个有趣的问题,涉及从矩阵中取出最后一个day 并找到它的last month 天。例如,如果今天的日期是 Oct-10-2011,您尝试在矩阵中搜索 Sep-10-2011 或第一天

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 的最后日期后,我需要获得确切的_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

【问题讨论】:

    标签: search matlab date date-manipulation


    【解决方案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
    

    【讨论】:

    • 谢谢乔纳斯。我现在尝试使用不同的方法。恐怕在非常大的矩阵(>1m 行)上运行 for 循环可能会花费很多时间。我确实得到了一个接近的答案 - mathworks.com/matlabcentral/answers/… 但是当上个月没有找到匹配的条目时它失败了。
    • @Jonas... 我的理解是arrayfun 运行速度比 for 循环快得多。我可以创建一个非常大的数组(使用 nan 值放置虚拟行)。然后,我会将 nan 替换为来自相同 ID 的上述值。我为此发布了一个新的 Q。谢谢乔纳斯!
    • @Maddy:我已经结合了上个月日期的矢量化计算查找的好主意(使用分析器检查它是否确实比使用addtodate!),我有添加了对何时找不到匹配条目的检查。
    • @Maddy:也许在较新版本的 Matlab 中,他们使用了多线程阵列,所以它可能会为您带来一些速度提升。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多