Mean a matrix columnwise based on another logical matrix

3 visualizaciones (últimos 30 días)
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 comentario
Jan
Jan el 18 de Jun. de 2013
This is obviously an interesting question, which allows to shed light on different powers of Matlab. +1

Iniciar sesión para comentar.

Respuesta aceptada

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

Iniciar sesión para comentar.

Más respuestas (4)

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

Iniciar sesión para comentar.


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

Iniciar sesión para comentar.


Giorgos Papakonstantinou
Giorgos Papakonstantinou el 17 de Jun. de 2013
Thank you guys!

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Etiquetas

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by