Piece-wise linspace

8 views (last 30 days)
Toze
Toze on 30 Jan 2012
Hi
I need to generate a vector (0's and 1's), when I'm given indices for the starting and endpoints of the 1's trains.
Example: m=zeros(1,10); starts=[1 5 9]; ends=[3 6 9];
the generated vector should be [1 1 1 0 1 1 0 0 1 0]
Any way of avoiding a loop? [starts(:):ends(:)] only looks at the first entry of the source vectors...
thanks Tozé

Accepted Answer

Jan
Jan on 30 Jan 2012
Do the sections overlap? If not, try this:
m = zeros(1, 10);
starts = [1 5 9];
ends = [3 6 9];
m(starts) = 1;
m(ends) = -1;
m = cumsum(m);
If they sections are overlapping:
m = zeros(1, 10);
p = zeros(1, 10);
starts = [1 5 9];
ends = [3 6 9];
m(starts) = 1;
m(ends) = -1;
m = cumsum(m);
p(m > 0) = 1;
I cannot test this currently, so please keep care.
And perhaps this helps: FEX: interval merging.

More Answers (3)

Bjorn Gustavsson
Bjorn Gustavsson on 30 Jan 2012
Why bother searching for a cunning loop-free version (non-explicit) when the looped version is so straightforward? How much time does it take to come up with something clever compared to the potential gain in run-time?
HTH,

Toze
Toze on 30 Jan 2012
Hi HTH I have aprox. 10^10 elements in each run... Tozé

Toze
Toze on 30 Jan 2012
Hi Jan
With one minor change (m(ends) should be m(ends+1)), this is exactly what I was looking for .. a clever solution.

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!