How to subtract mean along rows?

11 views (last 30 days)
JFz
JFz on 5 Jan 2018
Commented: JFz on 8 Jan 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.

Accepted Answer

Manan Mishra
Manan Mishra on 8 Jan 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 Comment
JFz
JFz on 8 Jan 2018
Thank you so much! Let me try it today. Happy New Year!

Sign in to comment.

More Answers (2)

Guillaume
Guillaume on 8 Jan 2018
Edited: Guillaume on 8 Jan 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 Comment
JFz
JFz on 8 Jan 2018
Thanks! I will try this one too.
If this also works. I will accept both answers. :-).

Sign in to comment.


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

Sign in to comment.

Categories

Find more on 2-D and 3-D Plots in Help Center and File Exchange

Tags

Products

Community Treasure Hunt

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

Start Hunting!