2011-03-22 4 views
0

2 개의 행렬이 동일한 ID를 가지고 있습니다. mat1에서 해당 ID 행을 추출해야합니다. 날짜는 해당 날짜의 ± 5 일 내에 mat2입니다. 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

+0

그래서'mat1'의 각 행과'mat2'의 모든 행을 비교하여 ± 5 일 내에 있는지 확인해야합니다. – eykanal

+0

죄송합니다. 마지막 요청 ... 질문을 편집하여 네 개의 열에 레이블을 줄 수 있습니까? 무슨 일인지 모르겠습니다. – eykanal

답변

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

안녕 Yuk .. 반응에 대한 감사합니다. 이 코드는 범위 내의 날짜와 일치하지만이 날짜는 ID의 하위 그룹 (열 1 및 2) 내에서 확인해야합니다. 간단히 말하면, mat1에서 AAPL 행을 가져 와서 mat2의 AAPL 행에서 날짜를 검색한다고 가정 해보십시오. 행 수는 다를 수 있습니다. 이 작업을 수행하기 위해 accumarray를 사용 하시겠습니까? – Maddy