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

请先登录,再进行评论。

 采纳的回答

Or:
m = sum(a .* b, 1) ./ sum(b, 1);

4 个评论

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 个)

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.

请先登录,再进行评论。

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;
c=a.*b
c(c==0)=nan;
out=nanmean(c)

2 个评论

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