How to subtract mean along rows?

10 visualizaciones (últimos 30 días)
JFz
JFz el 5 de En. de 2018
Comentada: JFz el 8 de En. de 2018
Hi,
I have a matrix 100x120 and I can group along the rows by findgroups. Then I use mean_mat = splitapply(@mean, mat, G) to get the means along rows. How to subtract the mean from the original matrix from each group? That is: for each group I, get mat_i - mean_mat_i? Thanks.

Respuesta aceptada

Manan Mishra
Manan Mishra el 8 de En. de 2018
One way to do this would be following:
When you operate on each individual row for finding groups using "findgroups" and mean using "splitapply", you can then use the variable "G" to separate the elements belonging to a specific group and subtract the group mean from each element.
For example,
if 'x' is my 100x120 matrix and x_r is a particular row I am operating on, after using these commands:
>> G = findgroups(x_r);
>> mean_mat = splitapply(@mean,x_r,G);
I can subtract the group mean from each element of that group by using the following commands:
>> x_r(G == 1) = x_r(G == 1) - mean_mat(1);
>> x_r(G == 2) = x_r(G == 2) - mean_mat(2);
.
.
.
If the number of groups are small, you can write these commands separately for each group. Otherwise, you can write a loop to do this for each group:
for(i = 1:max(G))
x_r(G == i) = x_r(G == i) - mean_mat(i);
end
  1 comentario
JFz
JFz el 8 de En. de 2018
Thank you so much! Let me try it today. Happy New Year!

Iniciar sesión para comentar.

Más respuestas (2)

Guillaume
Guillaume el 8 de En. de 2018
Editada: Guillaume el 8 de En. de 2018
A simpler way, which does not involve loops at all, just simple indexing:
mean_mat = splitapply(@mean, mat, G);
mat_minus_mean = mat - mean_mat(sub2ind(size(mean_mat), repmat(G, 1, size(meat, 2)), repmat(1:size(mat, 2), numel(G), 1)));
The mean_mat(sub2ind(...)) simply creates a matrix the same size as mat whose row r is mean_mat(G(r), :). This is then simply subtracted from mat.
  1 comentario
JFz
JFz el 8 de En. de 2018
Thanks! I will try this one too.
If this also works. I will accept both answers. :-).

Iniciar sesión para comentar.


JFz
JFz el 8 de En. de 2018
I think both answers are correct but I don't know how to choose both.
  2 comentarios
Guillaume
Guillaume el 8 de En. de 2018
You cannot accept two answers (but you can vote for as many as you want).
JFz
JFz el 8 de En. de 2018
OK. I accepted one and voted for the other. Hehe.

Iniciar sesión para comentar.

Categorías

Más información sobre Logical 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