Mean a matrix columnwise based on another logical matrix

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

This is obviously an interesting question, which allows to shed light on different powers of Matlab. +1

댓글을 달려면 로그인하십시오.

 채택된 답변

Jan
Jan 2013년 6월 16일
Or:
m = sum(a .* b, 1) ./ sum(b, 1);

댓글 수: 4

I always appreciate the alternatives..
Me too. And this one is the leanest and fastest one :-)
I agree Jan, +1, silly of me not to think of simply using the b matrix to get the correct number of nonzero elements.

댓글을 달려면 로그인하십시오.

추가 답변 (4개)

Andrei Bobrov
Andrei Bobrov 2013년 6월 17일
편집: Andrei Bobrov 2013년 6월 18일
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

I will celebrate the day that I will understand accumarray... Thank you Andrei
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
Wayne King 2013년 6월 16일
편집: Wayne King 2013년 6월 16일
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 2013년 6월 16일
c=a.*b
c(c==0)=nan;
out=nanmean(c)

댓글 수: 2

Thank you! You had the shortest!
Just learned about nanmean. I've been looking for a function like that for quite some time. I've always used some workaround. Thanks!

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Matrix Indexing에 대해 자세히 알아보기

제품

태그

Community Treasure Hunt

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

Start Hunting!

Translated by