Piece-wise linspace

8 visualizzazioni (ultimi 30 giorni)
Toze
Toze il 30 Gen 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é

Risposta accettata

Jan
Jan il 30 Gen 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.

Più risposte (3)

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

Toze
Toze il 30 Gen 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.

Categorie

Scopri di più su Creating and Concatenating Matrices in Help Center e File Exchange

Tag

Community Treasure Hunt

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

Start Hunting!

Translated by