2015-10-14 2 views
1

J'ai plusieurs matrices que j'ai besoin d'ajouter à une grande matrice. La grande matrice (300002x50) est divisée par 0,001 seconde et la synchronisation pour les 49 autres matrices (14250x2) est approximativement 0,02, mais pas uniformément répartie. J'ai essayé find pour indexer les entrées des plus petites matrices dans la plus grande matrice, mais c'était trop lent. Je l'ai essayé depuis:Comment implémenter l'indexation logique plus rapidement dans matlab?

 for a = 1:length(test) 
      aaa = abs(AF1(:,1)-test(a,1))<10^-6; 
      AF1(aaa,index)=test(a,2); 
     end 

test est un 14250x2 à double (time,data), AF1 est une double matrice 300002x50 et index est quelle colonne en AF1 les données seront ajoutées à. C'était un peu plus rapide, mais cela prend encore 99,3% (29 minutes) du temps. Cela fonctionne comme je le veux, mais y a-t-il un moyen de le mettre en œuvre plus rapidement?

+0

Comment vous retrouverez-vous avec 50 matrices? Probablement, il y a quelque chose à améliorer là-dedans. – Adriaan

+0

Aussi qu'est-ce que l'index? Est-ce une deuxième boucle sur toutes les colonnes? Ou sélectionnez-vous plusieurs lignes à la fois? –

+0

J'ai 49 ensembles de données et ils viennent tous avec leur propre synchronisation (la plus divisée par .02), mais certains sont divisés par .019 et .021, donc ce n'est pas uniforme. Les horaires ne correspondent pas entre les ensembles. – mtourtelot

Répondre

0

mémoire permettant et sauf unique cas où index ~= 1, vous pouvez utiliser une approche vectorisé avec une famille de fonctions utiles qui comprend bsxfun et accumarray, bien soutenu par find et abs, sous la direction de mesure de linear indexing -

[R,C] = find(abs(bsxfun(@minus,AF1(:,1),test(:,1).')) < 10^-6) %//' 
idx = accumarray(R,C,[],@max) 

AF1((index-1)*size(AF1,1) + find(idx)) = test(idx(idx~=0),2); 

mémoire ne permettant pas, tu commettre le crime d'utiliser une boucle, ce serait une version modifiée de la boucle existante, comme si -

valid_mask = true(size(AF1,1),1); 
for a = size(test,1):-1:1 
    aaa = (abs(AF1(:,1)-test(a,1))<comp_val) & valid_mask; 
    valid_mask(aaa) = 0; 
    AF1(aaa,index)=test(a,2); 
end 
+0

Je n'ai pas pu utiliser bsxfun de cette manière en raison d'une mémoire insuffisante – mtourtelot

+0

@mtourtelot Yup! J'avais peur que vous pourriez rencontrer cette situation :) – Divakar

+0

@mtourtelot Vérifiez les codes ajoutés s'il vous plaît. – Divakar