Est-il un moyen vectorisée pour fonctionner sur un nombre différent de valeurs par colonne dans Matlab?

StackOverflow https://stackoverflow.com/questions/3740051

  •  03-10-2019
  •  | 
  •  

Question

Dans Matlab, est-il un moyen plus concis pour gérer l'indexation conditionnelle discrète par colonne à l'aide d'une boucle? Voici mon code:

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. Les travaux de code ci-dessus, mais je me demande s'il y a un moyen plus concis pour le faire?

Était-ce utile?

La solution

Vous avez mentionné que vous utilisiez la fonction PRCTILE , qui indiquerait que vous avez accès au Statistics Toolbox . Cela vous donne une autre option pour la façon dont vous pouvez 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 réglées sur NaN utilisant BSXFUN , puis la moyenne de chaque colonne est calculée avec NANMEAN :

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

Autres conseils

Je ne sais pas d'aucune façon d'indexer les colonnes de la façon dont vous voulez. Cela peut être plus rapide qu'une boucle, mais il crée aussi une matrice y qui est 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 ce soit plus concis.

Voici une façon de résoudre votre problème d'origine. Vous avez un tableau, et vous voulez connaître la moyenne de la partie supérieure 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top