WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zeitabfolge bestimmen

 

Claudi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2012, 13:55     Titel: Zeitabfolge bestimmen
  Antworten mit Zitat      
Hallo,

ich habe ein etwas komplexeres Problem.
Ich habe eine Matrix mit 5 Spalten (1.Spalte ID, 3. Spalte Phasen und 5. Spalte Jahre)
Die Matrix habe ich mit sortrows nach diesen 3 Spalten sortiert.

Ich möchte nun schauen für wieviele Jahre (am besten aufeinanderfolgende/ ohne Lücken) ich die Phase x mit ID y habe.

Ich hab im Moment noch keine Idee, wie ich das realisieren soll. Sad Ich bin auch so noch nicht ganz der Profi in Matlab.

Anbei meine Textdatei die ich in Matlab eingeladen habe, zur Veranschaulichung.

Im Grunde kann als 6. Spalte die Anzahl der zusammenhängenden Jahre (Bsp: bei der 2 in der ersten Zeile wären es für diese ID keine zusammenhängenden Jahre) stehen.
es würde mir auch reichen, wenn in der 6. Spalte (oder in einer neuen Variable) einfach nur 7 steht (für 7 Jahre)
schöner wär aber die erste Variante.


Kann mir einer helfen?

Danke im Voraus

LG Claudi

test.txt
 Beschreibung:

Download
 Dateiname:  test.txt
 Dateigröße:  389.85 KB
 Heruntergeladen:  365 mal


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 13.03.2012, 14:07     Titel:
  Antworten mit Zitat      
versteh nicht was du mit lücken meinst aber mit
Code:
a=randi(5,1000,3);
b=a(a(:,1)==5 & a(:,2)==1,:); %spalten mit phase 5 und id 1

kannst du deine spalten durchsuchen und nur die raussuchen die dich interessieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2012, 14:12     Titel:
  Antworten mit Zitat      
Hallo,

also ich brauch quasi nur die IDs und Phasen (Spalte 1 und 3) die durchgänge Jahre (Spalte 5) aufweisen und dann am Ende auch noch Jahresreihen von mind. 10 Jahren haben.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 13.03.2012, 14:15     Titel:
  Antworten mit Zitat      
wenn du mit dem was ich oben gesagt ahbe dir deine phasen id combinationen gesucht hast kannst du mit
Code:
rausfinden welche jahre nichtaufeinder folgen.
dort ist die differenz benachbarter jahre nicht 1
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2012, 16:01     Titel:
  Antworten mit Zitat      
Ich hab mich mal abgemüht und das mit for schleifen probiert.
Ich denke es ist umständlich aber funktioniert (noch nicht ganz)

Ich hab meine Daten auch in einem Cell Array, diese hab ich dann sortiert und mir über diverse For_Schleifen herausgefiltert, ob die Zeitreihen durchgängig sind (1 in Spalte 6) oder nicht (0 in Spalte 6).
Das ganze funktioniert für ein Cell - Array super. Nur muss um den ganzen Code noch eine Schleife rum, dass wenn er mit dem ersten Cell - array fertig ist, einfach zum nächsten geht.

Die For_Schleife, die schon drumherumsteht mit z funktioniert, aber die Daten in X werden überschrieben.

Wie kann ich das ändern bzw. was muss noch in die äußerste For_Schleife rein, dass wenn meine erste Cell - array (21 Werte in X) mit der zweiten Cell - array an 22. Stelle in X weitermacht?

hier der Code:

Code:
for z = 1:length(Erg_HIS)
   
     
    ABC = sortrows(Erg_HIS{z},[1 3 5]);
   
       
    X = unique (ABC(:,3))
       
     
        for i= 1:length(X)
            Z = sum (ismember(ABC, X(i,1)))
            X(i,2)= Z(1,3)
        end
               
        X(:,4)=ABC(1,1);
       
        k = 1;  
   
        for j = 1:length(X)
   
        xx = ABC(k:X(j,2)+k-1,5); %Jahresvektor
        start = xx(1,1);
        ende = xx(length(xx),1);
   
        if length(xx) == ende - start +1
       
            X(j,6) = 1; %true
   
        else X(j,6) = 0; %false
       
        end

        k = k+length(xx);
   
        end
       
       
end
 
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 13.03.2012, 16:05     Titel:
  Antworten mit Zitat      
du könntest in der inneren schleife mitzählen alla
Code:

X(k,6)
k=k+1

das würde nicht bei jedem durchlauf der äußeren schleife resettet. sonst fängst du ja immer bei j=1 an.
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2012, 16:12     Titel:
  Antworten mit Zitat      
wo genau muss dann da rein?
 
Claudi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2012, 16:13     Titel:
  Antworten mit Zitat      
wenn ich bei der if schleife das j durch ein k ersetze, dann überschreibt der mir in X trotzdem die Daten und haut ans Ende nur noch paar Zellen mit Nullen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 13.03.2012, 16:19     Titel:
  Antworten mit Zitat      
k giebts bei dir auch schon war ein schlechtes beispiel. nimm en variable die nicht vergeben ist. diese musst du dann außerhalb der äußeren schleife noch mit var=1 initialisieren.
Code:

var=1
for k=1:10
for j=1:10
x(var)=j*k;
var=var+1;
end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2012, 16:30     Titel:
  Antworten mit Zitat      
Funktioniert immernoch nicht:

hier nun der Code mit deiner Hilfe:

Code:
for z = 1:length(Erg_HIS)
   
    y =1
    for k=1:10
    for j=1:10
    x(y)=j*k;
    y=y+1;
    end
    end
     
    ABC = sortrows(Erg_HIS{z},[1 3 5]);
   
   
    X = unique (ABC(:,3))
       
     
        for i= 1:length(X)
            Z = sum (ismember(ABC, X(i,1)))
            X(i,2)= Z(1,3)
        end
               
        X(:,4)=ABC(1,1);
       
       
       
        k = 1;  
   
        for j = 1:length(X)
   
        xx = ABC(k:X(j,2)+k-1,5); %Jahresvektor
        start = xx(1,1);
        ende = xx(length(xx),1);
   
        if length(xx) == ende - start +1
       
            X(y,6) = 1; %true
   
        else X(y,6) = 0; %false
       
        end

        k = k+length(xx);
   
        end
       
       
end


und wiederum nimmt er nun den letzten Cell Array und überschreibt die anderen Daten

Was mach ic falsch?
 
Claudi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2012, 16:34     Titel:
  Antworten mit Zitat      
es ist egal, ob dein Code außerhalb oder innerhalb der letzten Schleife steht.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 13.03.2012, 16:56     Titel:
  Antworten mit Zitat      
du hast mein beispiel nur bei dir reinkopiert. und nicht auf dein problem angewandt. du definerst aber oben auch immer dein X neu seh ich grade da wird meine lsg ach nicht helfen. es ist schwer das umzuschreiben da dein code so nicht lauffähig ist. und ich bin jetzt auch von rechner weg. wenn du nochmal lauffähigen code postest und dann nochmal schreibt inwieweit dein ergebniss vom gewünschten abweicht setzt ich mich morgen früh nochmal ran dann sollte sich schon eine lsg finden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2012, 08:59     Titel:
  Antworten mit Zitat      
Guten Morgen,

mein Code läuft doch (so wie ich ihn ursprünglich mal gepostet habe) und er bringt mir auch das gewünschte Ergebnis für einen Cell Array.

Ich brauch nur noch eine äußere Schleife, die sagt, dass wenn Matlab mit dem ersten Cell Array fertig ist, in das nächste übergeht und dann die Daten nicht bei X(1,1) reinschreibt sondern bei X((length(vondemXdavor),1).

Code:
ABC = sortrows(Erg_HIS{1},[1 3 5]);
   
   
    X = unique (ABC(:,3))
       
     
        for i= 1:length(X)
            Z = sum (ismember(ABC, X(i,1)))
            X(i,2)= Z(1,3)
        end
               
        X(:,4)=ABC(1,1);
       
       
       
        k = 1;  
   
        for j = 1:length(X)
   
        xx = ABC(k:X(j,2)+k-1,5); %Jahresvektor
        start = xx(1,1);
        ende = xx(length(xx),1);
   
        if length(xx) == ende - start +1
       
            X(y,6) = 1; %true
   
        else X(y,6) = 0; %false
       
        end

        k = k+length(xx);
   
        end


Danke dir =)
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.