2017-09-11 1 views
0

두 개의 행렬 A와 B가 있습니다. 둘 다 서로 다른 크기를 가지며 둘째 행의 첫 번째, 두 번째, 세 번째, & 번째 값은 연, 월, 일 및 값을 표시합니다. 같은 해와 같은 달과 행을 추출해야하지만, 행렬 A와 관련 행에서 행렬의 +/- 6 일을 추출해야합니다. 둘 이상의 행렬이 행렬 A 근처에있는 경우 & B에 해당하는 행을 선택해야합니다. 두 행렬의 값. 이 코딩하는 방법가장 가까운 요일 레코드가있는 행의 행을 추출합니다. MATLAB

C = 1954 12 22 2,7411 1954 12 28 774 
1959 1 3 1,7784 1959 1 10 421 
1959 1 24 1,1871 1959 1 24 419 
1960 12 4 1,7213 1960 12 8 829 
1962 2 12 2,1813 1962 2 15 628 
1966 12 24 1,8173 1966 12 27 802 
1968 1 15 1,6567 1968 1 17 981 

어떤 도움 :

A = 1954 1 16 2,3042 
1954 12 5 2,116 
1954 12 21 1,9841 
1954 12 22 2,7411 
1955 1 13 1,8766 
1955 10 16 1,4003 
1955 12 29 1,4979 
1956 1 19 2,1439 
1956 1 21 1,7666 
1956 11 26 1,7367 
1956 11 27 1,8914 
1957 1 27 1,151 
1957 2 2 1,1484 
1957 12 29 1,1906 
1957 12 30 1,3157 
1958 1 10 1,6186 
1958 1 20 1,1637 
1958 2 6 1,1639 
1958 10 16 1,1444 
1959 1 3 1,7784 
1959 1 24 1,1871 
1959 2 20 1,2264 
1959 10 25 1,2194 
1960 6 29 1,2327 
1960 12 4 1,7213 
1960 12 5 1,373 
1961 3 21 1,7149 
1961 3 27 1,4404 
1961 11 3 1,3934 
1961 12 5 1,777 
1962 2 12 2,1813 
1962 2 16 3,5776 
1962 2 17 1,9236 
1963 9 27 1,6164 
1963 10 13 1,786 
1963 10 14 1,9203 
1963 11 22 1,7575 
1964 2 2 1,4402 
1964 11 15 1,437 
1964 11 17 1,7588 
1964 12 4 1,6358 
1965 2 13 1,874 
1965 11 2 2,6468 
1965 11 26 1,7163 
1965 12 11 1,8283 
1966 12 1 2,1165 
1966 12 19 1,6672 
1966 12 24 1,8173 
1966 12 25 1,4923 
1967 2 23 2,3002 
1967 3 1 1,9614 
1967 3 18 1,673 
1967 11 12 1,724 
1968 1 4 1,6355 
1968 1 15 1,6567 
1968 3 6 1,1587 
1968 3 18 1,212 
1969 9 29 1,5613 
1969 10 1 1,5016 
1969 11 20 1,9304 
1969 11 29 1,9279 
1970 10 3 1,9859 
1970 10 28 1,4065 
1970 11 4 1,4227 
1970 11 9 1,7901 

B = 1954 12 28 774 
1954 12 29 734 
1955 3 26 712 
1955 3 27 648 
1956 7 18 1030 
1956 7 23 1090 
1957 2 17 549 
1957 2 28 549 
1958 2 27 759 
1958 2 28 798 
1959 1 10 421 
1959 1 24 419 
1960 12 5 762 
1960 12 8 829 
1961 2 12 788 
1961 2 13 776 
1962 2 15 628 
1962 4 9 628 
1963 3 12 552 
1963 3 13 552 
1964 2 12 260 
1964 2 13 253 
1965 12 22 862 
1965 12 23 891 
1966 1 5 828 
1966 12 27 802 
1967 1 1 777 
1967 1 2 787 
1968 1 17 981 
1968 1 18 932 
1969 3 15 511 
1969 3 16 546 
1970 2 25 1030 
1970 2 26 1030 

예상 출력은 새로운 행렬 C입니까?

은 연도와 월 경계에서 중복 처리하기 위해, 그것이 시대 이후의 일 수에 매핑 된 날짜가하는 것이 유용 -

+0

그러나 여러 날짜가 6 일 범위 내에 있으면 어떻게됩니까? – Wolfie

+0

"두 행렬에서 +/- 6 일의 일과 행렬 두 행을 포함하는 새로운 행렬을 형성하십시오."당신이 의미하는 것을 명확히 할 수 있습니까? – xrr

+0

나는 질문을 편집했다. – Poulomi

답변

0

나는 당신이 원하는 일을해야 다음 생각합니다. 첫 번째 함수는 두 데이터 집합 중 가장 빠른 데이터를 찾은 다음 'daysact'함수에 의해 해석되도록 형식을 지정합니다.

function epoch_date_str = get_epoch_datestr(A,B) 
    Astr = int2str(A(:,1:3)); 
    Bstr = int2str(B(:,1:3)); 
    [epoch_Ay, epoch_Am, epoch_Ad] = earliest_date(A); 
    [epoch_By, epoch_Bm, epoch_Bd] = earliest_date(B); 
    [epoch_y, epoch_m, epoch_d] = earliest_date([epoch_Ay, epoch_Am, epoch_Ad; epoch_By, epoch_Bm, epoch_Bd]); 
    epoch_str = int2str([epoch_y, epoch_m, epoch_d]); 
    epoch_date_str = regexprep(epoch_str,'\s+','/') 
end 

이 기능은 다음 데이터 집합의 각 날짜의 시대에서 일수의 계산을 수행, 그것은 기본적으로 단지 daysact 기능에 의해 허용 형식으로 데이터를 논쟁입니다.

function ndays = days_since_epoch(A, epoch_date_str) 
    ndays = zeros(size(A,1),1); 
    Astr = int2str(A(:,1:3)); 
    for i=1:size(Astr,1) 
     ndays(i) = daysact(epoch_date_str, regexprep(Astr(i,:),'\s+','/')); 
    end 
end 

그리고 지금 우리가 실제 계산과에 얻을 수 있습니다 - 당신이 제시 한 'A'매트릭스에서 다섯 번째 열 혼란을 조금했다, 나는 그 점수 가정,하지만 경우가 구성한 것 A_MATRIX_SCORE_COL 변수. 마찬가지로 6 일짜리 창은 WINDOW_SIZE으로 구성됩니다.

C = 

    1954  12  22  2 7411 1954  12  28 774 
    1959  1  24  1 1871 1959  1  24 419 
    1960  12  4  1 7213 1960  12  5 762 
    1960  12  4  1 7213 1960  12  8 829 
    1962  2  16  3 5776 1962  2  15 628 
    1966  12  24  1 8173 1966  12  27 802 
    1968  1  15  1 6567 1968  1  17 981 
    1968  1  15  1 6567 1968  1  18 932 

그러나 두 번째 행 7 일의 차이가, 그래서 그것을 찾을 수 기대하지 않을 것이다 :

ep_str = get_epoch_datestr(A,B); 
ndaysA = days_since_epoch(A, ep_str); 
ndaysB = days_since_epoch(B, ep_str); 
C = []; 

WINDOW_SIZE= 6; 
A_MATRIX_SCORE_COL = 5; 
for i=1:length(B) 
    % Find dates within the date window 
    overlaps = find(ndaysA >= (ndaysB(i) - window_size) & (ndaysA <= (ndaysB(i) + window_size))); 
    % If there are multiple matches, choose the highest and append to C 
    if (length(overlaps) > 0) 
     [~, max_idx] = max(A(overlaps,A_MATRIX_SCORE_COL)); 
     match_row = overlaps(max_idx); 
     C = [C; A(match_row,:) B(i,:)]; 
    end 
end 
C = unique(C,'rows'); 

출력은 내가 당신에서 다릅니다 얻을. window_size를 7로 늘리면 포함시킬 수 있습니다.

B에서 하나 이상의 날짜와 일치하는 경우 A의 행이 C에 두 번 포함될 수 있습니다. 이는 C에서 쉽게 필터링 할 수 있습니다 원하는 경우 :

D = [] 
for i = 1:size(C,1) 
    % Find matching dates from A. Due to the way C was built, there won't be duplicates from B. 
    dupes = find((C(:,1) == C(i,1) & C(:,2) == C(i,2) & C(:,3) == C(i,3))) 
    % If there's only one match (i.e. it matches itself), then add to D 
    if (length(dupes) == 1) 
     D = [D; C(i,:)] 
    else 
    % If there are duplicates, then compare the scores from B and only add the highest score to D. 
     best = true; 
     for j=1:length(dupes) 
      if C(i,end) < C(dupes(j),end) 
       best = false; 
      end 
     end 
     if (best == true) 
      D = [D; C(i,:)] 
     end 
    end 
end 

매트릭스 'D'는 중복되지 않은 출력입니다.

관련 문제