Breaking and spliting vector into groups and averaging

3 Ansichten (letzte 30 Tage)
Albert
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];

Akzeptierte Antwort

Adam Danz
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 Kommentare
Adam Danz
Adam Danz am 11 Mär. 2021
To define groups by the chunk vector resetting to 0,
chunk = [0 0 0 1 1 1 1 0 0 0 0 1]
chunk = 1×12
0 0 0 1 1 1 1 0 0 0 0 1
g = cumsum(diff([1,chunk])==-1)
g = 1×12
1 1 1 1 1 1 1 2 2 2 2 2
For the second question, do you mean this?
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]);
X = timevec(cond);
Y = chunk(cond);
g = cumsum([1, diff(Y)]~=0);
groupMeans = splitapply(@mean, X, g)
Albert
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.

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!

Translated by