Mean a matrix columnwise based on another logical matrix

2 Ansichten (letzte 30 Tage)
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 Kommentar
Jan
Jan am 18 Jun. 2013
This is obviously an interesting question, which allows to shed light on different powers of Matlab. +1

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Jan
Jan am 16 Jun. 2013
Or:
m = sum(a .* b, 1) ./ sum(b, 1);
  4 Kommentare
Wayne King
Wayne King am 17 Jun. 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.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (4)

Andrei Bobrov
Andrei Bobrov am 17 Jun. 2013
Bearbeitet: Andrei Bobrov am 18 Jun. 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 Kommentare
Giorgos Papakonstantinou
Giorgos Papakonstantinou am 17 Jun. 2013
I will celebrate the day that I will understand accumarray... Thank you Andrei
Jan
Jan am 18 Jun. 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.

Melden Sie sich an, um zu kommentieren.


Wayne King
Wayne King am 16 Jun. 2013
Bearbeitet: Wayne King am 16 Jun. 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 am 16 Jun. 2013
c=a.*b
c(c==0)=nan;
out=nanmean(c)
  2 Kommentare
Giorgos Papakonstantinou
Giorgos Papakonstantinou am 17 Jun. 2013
Thank you! You had the shortest!
John Doe
John Doe am 18 Jun. 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!

Melden Sie sich an, um zu kommentieren.


Giorgos Papakonstantinou
Giorgos Papakonstantinou am 17 Jun. 2013
Thank you guys!

Kategorien

Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange

Tags

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by