2011-03-22 37 views
0

我有2个矩阵与SAME ID。我需要从mat1中提取这些行的ID,其日期在mat2中日期的±5天内。对于mat2也是相同的操作。请看这里的数据:UNIQCols = [1 2] ; dateCol = [3] ; valueCol = [4] ; dayRange = +- 15days会员检查和日期范围检查在Matlab

 % UniqCol Date Value 
mat1 = [2001 2 733427 1001 ; 
     2001 2 733793 2002 ; 
     2001 2 734582 2003 ; 
     3001 1 734220 30 ; 
     3001 1 734588 20 ;]; 
mat2 = [2001 2 733790 7777 ; 
     2001 2 734221 2222 ; 
     3001 1 734220 10 ; 
     3001 1 734588 40 ;] ; 

ans1 = [2001 2 733793 2002 ; 3001 1 734220 30 ; 3001 1 734588 20 ] ; 
ans2 = [2001 2 733790 7777 ; 3001 1 734220 10 ; 3001 1 734588 40 ] ; 

这需要是一个向量化的操作!这些ID按照日期的升序排列。日期在Q或年度基础上分开。所以范围将永远是< <(date2-date1)请帮助和谢谢!

+0

你是否仅限于matlab来完成此任务? Matlab是用于矩阵处理的;这与正好处于矩阵形式的日期一起工作。您可能会更好地服务于其他脚本语言。 – eykanal 2011-03-22 16:45:15

+0

因此,您需要将'mat1'中的每一行与'mat2'中的每一行进行比较,以查看它们是否在±5天之内? – eykanal 2011-03-22 16:49:02

+0

对不起,最后一个请求...请问您可以编辑问题,将标签分配给四列?我不确定是什么。 – eykanal 2011-03-22 17:12:36

回答

0

这是一个基于我在评论中提到的similar question的功能。记住你的矩阵必须按日期排序。

function match_for_xn = match_by_distance(xn, xm, maxdist) 
%#Generates index for elements in vector xn that close to any of elements in 
%#vector xm at least by distance maxdist 

match_for_xn = false(length(xn), 1); 
last_M = 1; 
for N = 1:length(xn) 
    %# search through M until we find a match. 
    for M = last_M:length(xm) 
    dist_to_curr = xm(M) - xn(N); 
    if abs(dist_to_curr) < maxdist 
     match_for_xn(N) = 1; 
     last_M = M; 
     break 
    elseif dist_to_curr > 0 
     last_M = M; 
     break 
    else 
     continue 
    end 

    end %# M 
end %# N 

而且测试脚本:

mat1 = sortrows([ 
     2001 2 733427 1001 ; 
     2001 2 733793 2002 ; 
     2001 2 734582 2003 ; 
     3001 1 734220 30 ; 
     3001 1 734588 20 ; 
     ],3); 
mat2 = sortrows([ 
     2001 2 733790 7777 ; 
     2001 2 734221 2222 ; 
     3001 1 734220 10 ; 
     3001 1 734588 40 ; 
     ],3); 

mat1_index = match_by_distance(mat1(:,3),mat2(:,3),5); 
ans1 = mat1(mat1_index,:); 
mat2_index = match_by_distance(mat2(:,3),mat1(:,3),5); 
ans2 = mat2(mat2_index,:); 

我还没有尝试过你的问题的任何解决方案矢量。如果您对该解决方案进行了任何尝试,并检查时序和内存消耗(包括排序步骤)。

+0

嗨唷..感谢您的回复。此代码确实符合范围内的日期,但这些日期需要在ID的子组内进行检查(列1和列2)。简而言之,假设您从mat1中获取AAPL的行,并在mat2中搜索AAPL的行中的日期。行数可以不同。你可以请建议使用准确的做法吗? – Maddy 2011-03-29 21:00:47