2014-09-23 14 views
6

ho due vettori che contengono le "start" e le posizioni "finali" (come Logicals) che desidero di coniugare da creare un terzo vettore, Final:Crea Vector varia da variabili

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]; 

Con il finale Vector simile a questo:

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

Attualmente, posso raggiungere questo obiettivo utilizzando un ciclo for come segue:

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 

Mi chiedevo se c'è un modo per realizzare la stessa identica cosa senza un ciclo for. Ad esempio, ho potuto compiere ciò che ho descritto sopra con la seguente affermazione "hard-coded":

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

particolare, c'è un modo per combinare i Start_Locations e End_Locations vettori in un modo tale da poter disporre di un unico dichiarazione come:

Final(Combined_Start_and_End_Locations,1) = 1; 

per realizzare quello che ho fatto con la for ciclo precedente? Sto cercando di imparare a evitare i loop di for il più possibile e apprezzerei davvero qualsiasi soluzione che crea il vettore Final come descritto sopra senza ricorrere a un ciclo.

risposta

7

Problemi come questo possono spesso essere risolti utilizzando diff o cumsum. Sono essenzialmente derivate discrete e funzioni di integrazione.

per il vostro problema credo che

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

raggiunge il risultato desiderato.

+0

In tal caso questa soluzione restituisce '[0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1]' che mi sembra corretto. – Trogdor

+0

Sì, hai ragione, stavo pensando a qualcos'altro, credo! +1 – Divakar

+0

Wow, mi hai fatto preoccupare per un minuto ... grazie – Trogdor