f[a_] := Module[{b, startpos, endpos},
b = Differences[Subtract[1 , UnitStep[-Differences[a]]]];
(* for "nondescending" use this instead:*)
(* b = Differences[UnitStep[Differences[a]]];*)
startpos = Flatten[Position[b, 1]] + 1;
endpos = Flatten[Position[b, -1]] + 1;
If[startpos[[-1]] > endpos[[-1]], endpos = Join[endpos, {Length[a]}]];
If[startpos[[1]] > endpos[[1]], startpos = Join[{1}, startpos]];
Take[a, #] & /@ Transpose[{startpos, endpos}]
]
Now,
f[{1, -1, 2, 3, 4, 0, -2, 5, 0}]
{{-1, 2, 3, 4}, {-2, 5}}
#Edit
Edit
Here is the same function accelerated by Nearest
(instead of Position
) and a compiled routine to produce the sublists (instead of Take
):
f2[a_] := Module[{b, startpos, endpos},
b = Differences[Subtract[1, UnitStep[-Differences[a]]]];
(*b=Differences[UnitStep[Differences[a]]];*)
{startpos, endpos} = Nearest[b -> Automatic, {1, -1}] + 1;
If[startpos[[-1]] > endpos[[-1]], endpos = Join[endpos, {Length[a]}]];
If[startpos[[1]] > endpos[[1]], startpos = Join[{1}, startpos]];
Compile[{{a, _Integer, 1}, {startpos, _Integer}, {endpos, _Integer}},
a[[startpos ;; endpos]],
RuntimeAttributes -> {Listable},
Parallelization -> True
][a, startpos, endpos]
]
Test:
a = RandomInteger[{-100, 100}, {1000000}];
r1 = f[a]; // RepeatedTiming // First
r2 = f2[a]; // RepeatedTiming // First
r1 == r2
1.0
0.23
True