2014-09-23 12 views
6

ich zwei Vektoren haben, die die „Start“ und „Ende“ Stellen (wie Logicals), die ich als kombinieren möchten halten einen dritten Vektor zu erstellen, Final:erstellen Vector im Bereich von Variablen

Starts = [0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]; 
Ends = [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0]; 

Mit dem Endvektors suchen wie folgt aus:

Final = [0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0]; 

Derzeit ich dies mit einem for Schleife erreichen können wie folgt:

Start_Locations = find(Starts); 
End_Locations = find(Ends); 
Final = zeros(20,1); 

for x=1:length(Start_Locations) 

    Final(Start_Locations(x):End_Locations(x),1) = 1; 

end 

Ich frage mich, ob es eine Möglichkeit gibt, die gleiche genaue Sache ohne eine for Schleife zu erreichen. Zum Beispiel könnte ich erreichen, was ich oben skizzierte mit dem folgenden „hart codiert“ statement:

Final([4:8,11:19],1) = 1; 

Insbesondere ist es eine Möglichkeit, die Start_Locations und End_Locations Vektoren in einer Art und Weise so zu kombinieren, dass ich einen einzelnen haben könnte Aussage wie:

Final(Combined_Start_and_End_Locations,1) = 1; 

zu erreichen, was ich mit der for Schleife tat oben? Ich versuche zu lernen, zu vermeiden, for Schleifen so viel wie ich kann und würde wirklich jede Lösung zu schätzen, die den Final Vektor wie oben beschrieben erstellt, ohne auf eine Schleife zurückgreifen.

Antwort

7

Probleme wie diese können oft mit diff oder cumsum gelöst werden. Sie sind im Wesentlichen diskrete Ableitungen und Integrationsfunktionen.

Für Ihr Problem, das ich glaube, dass

Final = cumsum([Starts 0]-[0 Ends]); 
Final = Final(1:end-1); 

das gewünschte Ergebnis erzielt wird.

+0

In diesem Fall gibt diese Lösung "[0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]" zurück, was mir richtig erscheint. – Trogdor

+0

Ja, du hast Recht, ich habe etwas anderes gedacht, denke ich! +1 – Divakar

+0

Puh, du hast mich für eine Minute besorgt ... danke – Trogdor

Verwandte Themen