Piece-wise linspace

11 Ansichten (letzte 30 Tage)
Toze
Toze am 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é

Akzeptierte Antwort

Jan
Jan am 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.

Weitere Antworten (3)

Bjorn Gustavsson
Bjorn Gustavsson am 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 am 30 Jan. 2012
Hi HTH I have aprox. 10^10 elements in each run... Tozé

Toze
Toze am 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.

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by