2010-08-03 4 views
3

J'ai besoin que cette partie de mon code s'exécute plus rapidement, comme on l'appelle plusieurs fois. Je suis nouveau à Matlab et je me sens comme s'il devait y avoir un moyen de faire cela qui n'est pas si rond. Toute aide que vous pourriez donner sur la façon d'améliorer la vitesse de ce que j'ai ou d'autres fonctions à examiner dans ce qui m'aiderait à effectuer cette tâche serait appréciée.Matlab: Problème de performance de code Utilisation de "ismember"

(La tâche consiste à obtenir uniquement les lignes de "alldata" où la première colonne est dans l'ensemble des "minutesintervals" dans "alldataMinutes". "Minuteintervals" est juste la valeur minimale de la colonne "alldata" le maximum de alldata

minuteintervals= min(alldata(:,1)):20:max(alldata(:,1)); %20 second intervals 
alldataMinutes= zeros(30000,4); 
counter=1; 
for x=1:length(alldata) 
    if ismember(alldata(x,1), minuteintervals) 
     alldataMinutes(counter,:)= alldata(x,:); 
     counter= counter+1; 
    end 
end 
alldataMinutes(counter:length(alldataMinutes),:)= []; 

Répondre

1

Cela devrait vous donner ce que vous voulez, et il devrait être beaucoup plus rapide.

minuteintervals = min(alldata(:,1)):20:max(alldata(:,1)); %# Interval set 
index = ismember(alldata(:,1),minuteintervals); %# Logical index showing first 
               %# column values in the set 
alldataMinutes = alldata(index,:); %# Extract the corresponding rows 

Cela fonctionne en passant un vecteur des valeurs à la fonction ISMEMBER, au lieu de transmettre les valeurs une à la fois. La sortie index est un vecteur logical de la même taille que alldata(:,1), avec une valeur de 1 (c'est-à-dire vrai) pour les éléments de alldata(:,1) qui sont dans l'ensemble minuteintervals, et une valeur de 0 (c'est-à-dire faux) sinon. Vous pouvez ensuite utiliser logical indexing pour extraire facilement les lignes correspondant à celles du index, en les plaçant dans alldataMinutes.

+2

en utilisant ISMEMBC (http://UndocumentedmMtlab.com/blog/ismembc-undocumented-helper-function/) devrait améliorer les performances par rapport à ISMEMBER. Dans ce cas le boost est négligeable comparé à celui obtenu par la vectorisation de gnovice, mais juste FYI –

+1

@Yair: Bon à savoir, bien qu'il y ait une faute de frappe dans votre lien. Voici le [lien correct] (http://undocumentedmatlab.com/blog/ismembc-undocumented-helper-function/) pour toute personne intéressée. – gnovice

+0

merci de signaler gnovice :-) –