Mean a matrix columnwise based on another logical matrix
Afficher commentaires plus anciens
I want to mean the matrix a based on the logical matrix b columnwise: In other words this:
mean(a(b(:,1)))
mean(a(b(:,2)))
...
a =[
7 8 5 3
1 1 4 7
9 3 8 7
10 1 8 2
7 1 2 2
8 9 5 5
8 7 5 10
4 4 7 4
7 10 8 6
2 1 8 3];
b =logical([
0 0 1 0
1 0 1 0
1 0 1 1
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 0 0 1
0 0 0 1]);
1 commentaire
Jan
le 18 Juin 2013
This is obviously an interesting question, which allows to shed light on different powers of Matlab. +1
Réponse acceptée
Plus de réponses (4)
Andrei Bobrov
le 17 Juin 2013
Modifié(e) : Andrei Bobrov
le 18 Juin 2013
b1 = bsxfun(@times,b,1:4);
out = accumarray(b1(b),a(b),[],@mean);
or
[~,jj] = find(b);
out = accumarray(jj,a(b),[],@mean);
and in line with accumarray:
out = accumarray(ceil(find(b)/size(b,1)),a(b),[],@mean);
2 commentaires
Giorgos Papakonstantinou
le 17 Juin 2013
Jan
le 18 Juin 2013
Although I do not think that accumarray is the fastest approach here, I vote for it a sign of my admiration for all successful accumarray masters.
Wayne King
le 16 Juin 2013
Modifié(e) : Wayne King
le 16 Juin 2013
you mean just:
mean(a.*b)
or do you want the mean of just the nonzero entries? In other words, divide by the right number of elements.
C = a.*b;
for nn = 1:size(C,2)
numelements(nn) = nnz(C(:,nn));
end
colsumz = sum(C);
meanz = colsumz./numelements;
Azzi Abdelmalek
le 16 Juin 2013
c=a.*b
c(c==0)=nan;
out=nanmean(c)
2 commentaires
Giorgos Papakonstantinou
le 17 Juin 2013
John Doe
le 18 Juin 2013
Just learned about nanmean. I've been looking for a function like that for quite some time. I've always used some workaround. Thanks!
Giorgos Papakonstantinou
le 17 Juin 2013
0 votes
Catégories
En savoir plus sur Matrix Indexing dans Centre d'aide et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!