Mean a matrix columnwise based on another logical matrix

3 vues (au cours des 30 derniers jours)
Giorgos Papakonstantinou
Giorgos Papakonstantinou le 16 Juin 2013
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
Jan le 18 Juin 2013
This is obviously an interesting question, which allows to shed light on different powers of Matlab. +1

Connectez-vous pour commenter.

Réponse acceptée

Jan
Jan le 16 Juin 2013
Or:
m = sum(a .* b, 1) ./ sum(b, 1);
  4 commentaires
Wayne King
Wayne King le 17 Juin 2013
I agree Jan, +1, silly of me not to think of simply using the b matrix to get the correct number of nonzero elements.
Andrei Bobrov
Andrei Bobrov le 18 Juin 2013
+1

Connectez-vous pour commenter.

Plus de réponses (4)

Andrei Bobrov
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
Giorgos Papakonstantinou le 17 Juin 2013
I will celebrate the day that I will understand accumarray... Thank you Andrei
Jan
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.

Connectez-vous pour commenter.


Wayne King
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
Azzi Abdelmalek le 16 Juin 2013
c=a.*b
c(c==0)=nan;
out=nanmean(c)
  2 commentaires
Giorgos Papakonstantinou
Giorgos Papakonstantinou le 17 Juin 2013
Thank you! You had the shortest!
John Doe
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!

Connectez-vous pour commenter.


Giorgos Papakonstantinou
Giorgos Papakonstantinou le 17 Juin 2013
Thank you guys!

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Tags

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by