Sprunganzahl in Intervallen < Matlab < Mathe-Software < Mathe < Vorhilfe
 
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Frage) reagiert/warte auf Reaktion    |    | Datum: |  23:26 Sa 12.09.2009 |    | Autor: |  sorry_lb |   
	   
	   Hiho.
 
Also ich hab einen Vektor der die Sprungzeiten eines Poisson Prozesses angibt. Nehmen wir zum Beispiel den folgenden:
 
 
T =
 
 
  Columns 1 through 10
 
 
    6.5757   13.3526   18.8708   28.2824   33.5601   44.0928   44.7084   56.5159   56.8786   61.4723
 
 
  Columns 11 through 20
 
 
   76.7178   82.0771   83.6099   84.7590   87.7947   89.6775   90.2398  104.7608  110.7200  126.0948
 
 
  Columns 21 through 30
 
 
  134.2564  135.8978  137.5281  138.1798  140.8825  154.1302  154.5322  155.6456  161.9053  164.9525
 
 
  Columns 31 through 40
 
 
  165.0292  166.7018  167.5797  171.7618  175.5302  178.4230  184.9865  186.4314  189.8585  192.0370
 
 
  Columns 41 through 42
 
 
  197.9294  200.0000
 
 
Was ich möchte: ich möchte einen Vektor "anzsprint" (Anzahl Sprünge pro Intervall), der mir -welch Überraschung- angibt, wie viele Sprünge pro Intervall stattgefunden haben. Die Intervalle sind in 10er-Schritten abgegrenzt.
 
 
Bisher habe ich die umständliche Variante:
 
 
for i=1:h
 
    if T(i)<=10
 
        anzsprint(1)=i;
 
    elseif T(i)>10 && T(i)<=20
 
        anzsprint(2)=i - anzsprint(1);
 
    elseif T(i)>20 && T(i)<=30
 
       anzsprint(3)=i-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>30 && T(i)<=40
 
        anzsprint(4)=i-anzsprint(3)-anzsprint(2)-anzsprint(1) ;
 
    elseif T(i)>40 && T(i)<=50
 
        anzsprint(5)=i-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>50 && T(i)<=60
 
        anzsprint(6)=i- anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>60 && T(i)<=70
 
        anzsprint(7)=i- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>70 && T(i)<=80
 
        anzsprint(8)=i-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>80 && T(i)<=90
 
        anzsprint(9)=i-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>90 && T(i)<=100
 
        anzsprint(10)=i-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>100 && T(i)<=110
 
        anzsprint(11)=i-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>110 && T(i)<=120
 
        anzsprint(12)=i-anzsprint(11)-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>120 && T(i)<=130
 
        anzsprint(13)=i-anzsprint(12)-anzsprint(11)-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>130 && T(i)<=140
 
        anzsprint(14)=i- anzsprint(13)-anzsprint(12)-anzsprint(11)-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>140 && T(i)<=150
 
       anzsprint(15)=i- anzsprint(14)-anzsprint(13)-anzsprint(12)-anzsprint(11)-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>150 && T(i)<=160
 
        anzsprint(16)=i-anzsprint(15)- anzsprint(14)-anzsprint(13)-anzsprint(12)-anzsprint(11)-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>160 && T(i)<=170
 
        anzsprint(17)=i-anzsprint(16)-anzsprint(15)- anzsprint(14)-anzsprint(13)-anzsprint(12)-anzsprint(11)-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>170 && T(i)<=180
 
        anzsprint(18)=i-anzsprint(17)-anzsprint(16)-anzsprint(15)- anzsprint(14)-anzsprint(13)-anzsprint(12)-anzsprint(11)-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    elseif T(i)>180 && T(i)<=190
 
        anzsprint(19)=i-anzsprint(18)-anzsprint(17)-anzsprint(16)-anzsprint(15)- anzsprint(14)-anzsprint(13)-anzsprint(12)-anzsprint(11)-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
    else T(i)>190 && T(i)<=200
 
        anzsprint(20)=i-anzsprint(19)-anzsprint(18)-anzsprint(17)-anzsprint(16)-anzsprint(15)- anzsprint(14)-anzsprint(13)-anzsprint(12)-anzsprint(11)-anzsprint(10)-anzsprint(9)-anzsprint(8)-anzsprint(7)- anzsprint(6)-anzsprint(5)-anzsprint(4)-anzsprint(3)-anzsprint(2)-anzsprint(1);
 
 
    end 
 
end
 
 
Das funktioniert soweit ja auch ganz toll, allerdings möchte ich den Prozess nicht bei der Obergrenze von 200 enden lassen. Und wenn ich in den tausender Bereich gehe... naja das Problem ist bei meiner Variante wohl offensichtlich...
 
Ich denke, dass man das durch Schleifen lösen könnte, bei meinem Versuch hat er sich allerdings bei der Ausgabe von Nullen überschlagen...
 
 
for i=1:h
 
    for j=0:10:Tmax-10
 
        if j<T(i)<=j+10
 
            for k=i:1
 
                
 
                                              if (k<2) k=5000001; 
 
                                                  anzsprint(5000000)=0;           %um die ersten Summanden=0 zu haben, da negativer index nicht funktioniert                    
 
                                              end;
 
            anzsprint(i)=i-anzsprint(k-1)
 
            end;
 
        else break;
 
        end;
 
    end;
 
end;
 
 
Hat jemand eine tolle Alternative? Und noch ergänzend gefragt: gibt es eine galantere Lösung zum Umgehen des kleiner-gleich-null-index? hab das Problem öfters in meiner Arbeit und wie ichs oben gemacht hab, is´s unbefriedigend :) 
 
 
Lieben Dank und gute Nacht.
 
 
 
 
      | 
     
    
   | 
  
 |          | 
 
 
   | 
  
 
  
   
    
     
	   | Status: | 
	   		           				(Mitteilung) Reaktion unnötig    |    | Datum: |  10:16 Mo 21.09.2009 |    | Autor: |  sorry_lb |   
	   
	   also für die, die´s noch interessiert: (keine ahnung warum ich mich so schwer getan hab):
 
 
 
for i=1:h
 
    anzsprint(i)=0;
 
end;
 
 
T
 
r=(Tmax-10)/10;
 
 
for i=1:h
 
    for k=0:r
 
        if ((k*10+0) < T(i)) && (T(i)<= (k*10+10))
 
            anzsprint(k+1)= anzsprint(k+1)+1;
 
        else
 
            anzsprint(k+1)=anzsprint(k+1);
 
        end
 
    end
 
end
 
 
X=anzsprint  
 
 
      | 
     
    
   | 
  
 
 |   
  
   |