2009-09-20 6 views
3

Je suis inexpérimenté avec Matlab, désolé pour la question de débutant:MATLAB® l'exclusion des données en dehors 1 écart-type

J'ai un grand vecteur (905350 éléments) stocker tout un tas de données qu'il contient. J'ai l'écart type et la moyenne, et maintenant je veux découper tous les points de données qui sont au-dessus/en dessous d'un écart-type de la moyenne. Je ne sais pas comment. D'après ce que je comprends, je dois faire une double boucle?

Il est comme: moyenne-std < données que je veux < signifie + std

Répondre

5

Si les données sont dans la variable A, avec la moyenne enregistrée dans meanA et l'écart-type stocké dans stdA, les commandes suivantes vont extraire les données que vous voulez, tout en maintenant l'ordre initial des valeurs de données:

B = A((A > meanA-stdA) & (A < meanA+stdA)); 

Voici quelques liens de documentation utiles qui touchent les concepts utilisés ci-dessus: logical operators, matrix indexing.

0

Taking A comme vecteur d'origine, et B comme définitif:

B = sort(A) 
B = B(find(B > mean-std,1,'first'):find(B < mean+std,1,'last')) 
+2

Chaque fois que la programmation, gardez à faites attention aux caractéristiques de la langue avec laquelle vous travaillez. Spécifiquement avec Matlab, essayez d'éviter toute boucle si la fonctionnalité intégrée peut le couvrir. Grande réponse Lance. – LJM

+0

Lors de l'indexation dans Matlab, il faut éviter d'utiliser find, sauf si vous avez besoin de voir les index eux-mêmes. L'indexation logique est plus rapide. – Marc

0
y = x(x > mean-std); 
y = y(y < mean+std); 

devrait fonctionner. Voir FIND pour plus de détails. La commande FIND est utilisée implicitement dans le code ci-dessus.

+0

En fait, il n'utilise pas find. Il utilise l'indexation logique, qui est plus rapide. – Marc

6

Vous pouvez simplement utiliser la logique et élément par élément :

m = mean(A); 
sd = std(A); 
B = A(A>m-sd & A<m+sd); 

De plus, sachant que: |x|<c iff -c<x<c, vous pouvez combiner les deux en un seul comme:

B = A(abs(A-m)<sd); 
+0

Vos carets sont en arrière sur la ligne 3. –

+0

Merci j'ai raté;) – Amro

Questions connexes