2011-03-22 3 views
0

J'ai 2 matrices avec les ID SAME. J'ai besoin d'extraire ces lignes d'ID de mat1 qui ont leurs dates dans les ± 5 jours des dates dans le mat2. Même opération pour mat2. S'il vous plaît voir les données ici: UNIQCols = [1 2] ; dateCol = [3] ; valueCol = [4] ; dayRange = +- 15days.vérification de membre et vérification de la plage de dates 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 ] ; 

Ceci doit être une opération vectorisée! Les ID sont classés par ordre croissant de dates. Les dates sont séparées sur Q ou sur une base annuelle. Donc, la gamme sera toujours < < (date2-date1) S'il vous plaît aider et merci!

+0

Etes-vous limité à matlab pour cette tâche? Matlab est destiné à la manipulation matricielle; cela fonctionne avec des dates qui se trouvent sous forme matricielle. Vous pourriez être mieux servi en travaillant dans d'autres langages de script. – eykanal

+0

Donc, vous devez comparer chaque ligne de 'mat1' à chaque ligne de' mat2' pour voir si elles sont à ± 5 jours l'une de l'autre? – eykanal

+0

désolé, une dernière demande ... pouvez-vous s'il vous plaît modifier la question pour donner des étiquettes aux quatre colonnes? Je ne suis pas sûr de quoi. – eykanal

Répondre

0

Voici une fonction basée sur similar question dont j'ai parlé dans mes commentaires. Rappelez-vous que vos matrices doivent être triées par date.

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 

Et le script de test:

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,:); 

Je ne l'ai pas essayé une solution vectorisée pour votre problème. Si vous en avez, essayez-le contre cette solution et vérifiez le timing et la consommation de mémoire (incluez l'étape de tri).

+0

Hi Yuk..thanks pour la réponse. Ce code correspond aux dates dans la plage, mais ces dates doivent être vérifiées dans un sous-groupe d'ID (col 1 et 2). Dit simplement, disons que vous prenez des lignes de AAPL à partir de mat1 et recherchez les dates dans les lignes de AAPL dans mat2. Le nombre de lignes peut être différent. Pouvez-vous s'il vous plaît suggérer d'utiliser accumarray pour faire cela? – Maddy

Questions connexes