Mean a matrix columnwise based on another logical matrix

3 次查看(过去 30 天)
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 个评论
Jan
Jan 2013-6-18
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 个评论
Wayne King
Wayne King 2013-6-17
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 个评论
Giorgos Papakonstantinou
I will celebrate the day that I will understand accumarray... Thank you Andrei
Jan
Jan 2013-6-18
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 个评论
John Doe
John Doe 2013-6-18
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
Thank you guys!

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

标签

产品

Community Treasure Hunt

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

Start Hunting!

Translated by