Piece-wise linspace

11 vues (au cours des 30 derniers jours)
Toze
Toze le 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é

Réponse acceptée

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

Plus de réponses (3)

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

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

Catégories

En savoir plus sur Creating and Concatenating Matrices dans Help Center et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by