Breaking and spliting vector into groups and averaging

6 Ansichten (letzte 30 Tage)
Albert am 10 Mär. 2021
Bearbeitet: Albert am 11 Mär. 2021
Hi,
I have a long one-dimensional time vector that I want to split in chunks and average each chunk. I have another logical vector (same length) of 0s and 1s that changes the sign to signal each chunk transition. How could I easily use the information on the logical vector to select each chunk of the time vector?
Thanks!
timevec = [0 2 3 4 5 0 9 3 4];
chunk = [0 0 0 1 1 1 1 0 0];
0 Kommentare-1 ältere Kommentare anzeigen-1 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Adam Danz am 10 Mär. 2021
Bearbeitet: Adam Danz am 10 Mär. 2021
timevec = [0 2 3 4 5 0 9 3 4];
chunk = [0 0 0 1 1 1 1 0 0];
g = cumsum([1, diff(chunk)]~=0); % assuming 'chunk' is a row vector
groupMeans = splitapply(@mean, timevec, g)
groupMeans = 1×3
1.6667 4.5000 3.5000
5 Kommentare4 ältere Kommentare anzeigen4 ältere Kommentare ausblenden
Albert am 11 Mär. 2021
Bearbeitet: Albert am 11 Mär. 2021
For the first question, great, I didn't think it was so easy the adaptation!
For the second question it's a bit trickier because the Y array, after applying the condition in cond may totally mess around the chunks computation in the lines later on (transitions may be lost after applying the condition!). As a workaround I computed the chunks for all the values and applied the condition afterwards when computing the mean through a custom function as:
timevec = [0 2 3 4 5 0 9 3 4];
chunk = [0 0 0 1 1 1 1 0 0];
cond = logical([1 1 1 1 0 0 1 1 1]);
g = cumsum([1, diff(chunk)]~=0);
groupMeans = splitapply(@(vec,con)mean(vec(con)), timevec, cond, g)

Melden Sie sich an, um zu kommentieren.

Kategorien

Find more on Matrices and Arrays in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by