2010-09-18 23 views
3

Dans MATLAB, existe-t-il un moyen plus concis de gérer l'indexation conditionnelle discrète par colonne plutôt que d'utiliser une boucle for? Voici mon code:Existe-t-il une manière vectorisée d'opérer sur un nombre différent de valeurs par colonne dans MATLAB?

x=[1 2 3;4 5 6;7 8 9]; 
w=[5 3 2]; 

q=zeros(3,1); 
for i = 1:3 
    q(i)=mean(x(x(:,i)>w(i),i)); 
end 
q 

Mon but est de prendre la moyenne de la partie supérieure x% d'un ensemble de valeurs pour chaque colonne. Le code ci-dessus fonctionne, mais je me demande simplement s'il existe une façon plus concise de le faire?

+0

Êtes-vous juste essayer de prendre la moyenne d'une colonne après avoir exclu les valeurs aberrantes? Pouvez-vous élaborer sur ce que vous essayez d'accomplir? – linuxuser27

+0

Mon but est de prendre la moyenne du haut x% d'un ensemble de valeurs pour chacune d'une série d'exécutions. J'ai une matrice avec une colonne de données pour chaque exécution et utilisé la fonction prctile pour déterminer ma condition pour chaque exécution. Bien que le code ci-dessus fonctionne, il semble qu'il puisse y avoir une manière plus concise d'accomplir cette tâche. – user338714

Répondre

1

Vous avez mentionné que vous utilisiez la fonction PRCTILE, qui indiquerait que vous avez accès à Statistics Toolbox. Cela vous donne encore une autre option pour la façon dont vous pourriez résoudre votre problème, en utilisant la fonction NANMEAN. Dans le code suivant, toutes les entrées de x inférieure ou égale au seuil w pour une colonne sont mis à NaN en utilisant BSXFUN, la moyenne de chaque colonne est calculée avec NANMEAN:

x(bsxfun(@le,x,w)) = nan; 
q = nanmean(x); 
1

Je ne connais aucun moyen d'indexer les colonnes comme vous le souhaitez. Cela peut être plus rapide qu'une boucle for, mais cela crée aussi une matrice y qui a la taille de x.

x=[1 2 3;4 5 6;7 8 9]; 
w=[5 3 2]; 

y = x > repmat(w,size(x,1),1); 
q = sum(x.*y) ./ sum(y) 

Je ne prétends pas que c'est plus concis.

1

Voici une façon de résoudre votre problème d'origine: Vous avez un tableau, et vous voulez connaître la moyenne du haut x% de chaque colonne.

%# make up some data 
data = magic(5); 

%# find out how many rows the top 40% are 
nRows = floor(size(data,1)*0.4); 

%# sort the data in descending order 
data = sort(data,1,'descend'); 

%# take the mean of the top 20% of values in each column 
topMean = mean(data(1:nRows,:),1);