2016-08-02 4 views
1

Betrachten Sie das folgende Beispiel, in dem xFinding Start- und Zielindizes positive Kurven in Daten

ist
x = [randi([10 20],1,10) zeros(1,11) randi([10 20],1,10) zeros(1,11) randi([10 20],1,10) zeros(1,12) randi([10 20],1,11) ]; 

, die so etwas wie dies in der Handlung aussieht:

image

Nun, was ich will find ist der Anfangs- und Endindex jeder positiven Kurve in der Grafik und speichert sie in einer Matrix. Der Code, den ich unten geschrieben habe, funktioniert gut, aber ich nenne ihn nicht elegant. Hat jemand einen besseren und effizienteren Weg?

zero_padding = zeros(1,2); 
x = [randi([10 20],1,10) zeros(1,11) randi([10 20],1,10) zeros(1,11) randi([10 20],1,10) zeros(1,12) randi([10 20],1,11) ]; 
x = [x zero_padding] 
stp(1) = find(x>0 , 1, 'first') 
enp(1) = find(x(stp(1):end)==0 , 1, 'first') - 1 
stoffset = enp(1); 
i = 2 
while(~isempty(find(x(stoffset + 1:end)>0 , 1, 'first')))   
    stp(i) = find(x(stoffset + 1:end)>0 , 1, 'first') + stoffset 
    enp(i) = find(x(stp(i) + 1:end) == 0 , 1, 'first') + stp(i) - 1 
    stoffset = (enp(i)) + 1; 
    i = i + 1;  
end 

und der Ausgang ist:

>> stp = 

    1 22 43 65 


>> enp = 

    10 31 52 75 

, die korrekt ist.

HINWEIS: Ich habe mit bereits versucht:

startindex = (find(diff(x)>0)) + 1 
endindex = (find(diff(x)<0)) 

, die gut funktionieren würden, wenn die positiven Kurven einfach perfekt Plätze waren aber, wie Sie in den Stellplätzen sehen können, hat es viele Dips. Es ist also schwierig, es zu verwenden, da diff bei diesen Einbrüchen auch +1 oder -1 ergibt.

+0

Blick auf 'diff (data> 0)', sollen Sie in der Lage sein, von dort, wenn zur Arbeit (Hinweis zurückkehrt '1' wenn deine 'positiven Kurven' beginnen und' -1' wo sie enden) – Dan

+0

@Dan Ich habe diesen Ansatz bereits ausprobiert, das Problem taucht auf, wenn es viele Dips in den positiven Kurven gibt, wie du im x-Plot'diff siehst (Daten> 0) 'wird uns auch Indizes dieser Änderungen geben – Umar

+0

nein wird es nicht, es sei denn, dass diese sinkt gehe unter die '0'-Linie, in diesem Fall musst du klarer definieren, was du mit positiven Kurven meinst. Sobald Sie '0 'auf' Daten 'angewendet haben, werden alle diese Dips verschwinden – Dan

Antwort

1

Ihr zweiter Ansatz war ziemlich nah dh

startindex = (find(diff(x)>0)) + 1 
endindex = (find(diff(x)<0)) 

versucht vielmehr

posData = [0, x>0] %prepend with zero to catch if the data starts with a positive region 
startindex = find(diff(posData) == 1) 
endindex = find(diff(posData) == -1)