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

Struct Manipulation / structfun ?

 

Kerstin87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2012, 15:37     Titel: Struct Manipulation / structfun ?
  Antworten mit Zitat      
Hallo liebe matlab community,

seit geraumer zeit hänge ich an einem häufig wiederkehrendem problem und würde gerne wissen ob man dies besser/effizienter lösen könnte. Zu meinem Problem:

Ich lese eine unbekannte Anzahl von Dateien mittels importdata ein.

Ich habe dann ein struct-array 'mystruct' der größe (x,1) mit jeweils 2 Feldern. Wobei ein Feld Skalare sind (ausschließlich double-Werte von Messdaten = data) und das andere Feld sind Zeitstempel (textdata als cell). Ich habe also letztlich so etwas:

Code:

mystruct(1,1).data
mystruct(1,1).textdata

mystruct(2,1).data
mystruct(2,1).textdata
.
.
.
mystruct(x,1).data
mystruct(x,1).textdata
 


Jetzt möchte ich die Zeitstempel auswerten des ganzen arrays (also jedes structs) und will darauf die function datenum anwenden: Ich dachte zuerst an so etwas:
Code:

dates= datenum(mystruct(:,1).textdata{2:end,1}(1:10,1), 'dd.mm.yyyy');
 

Hierbei will ich ALLE structs untersuchen und somit jedes Feld textdata (dieses feld hat den typ "cell"). Im Feld textdata (größe: (y,1)) möchte ich aber lediglich nur die zeilen von bsp. {2:end,1} wie in obigem Beispiel ersichtlich. Die Einträge der Felder von textdata sind letztlich vom typ char und haben alle das Format ''dd.mm.yyyy HH:MM:SS'. Ich möchte aber zunächst nur 'dd.mm.yyyy' siehe oben.
Der Aufruf wie oben gezeigt funktioniert so nicht, da die cell indizierung so in matlab nicht möglich ist wie ich schon an anderer stelle gelesen habe. So eben bin ich auf die function structfun gestoßen mit der ich auch nicht so recht klar komme. Ich habe folgendes probiert:

Code:

datums = structfun(@(x) x(datenum(mystruct(:,1).textdata(2:end,1)(1:10), 'dd.mm.yyyy')), 'UniformOutput', false);
 


Funktioniert so leider auch nicht, blicke auch nicht so ganz durch wie das mit den function handles etc. anwenden muss. Die hilfe hilft mir in dem Fall auch nicht weiter.. Wink

Bisher hab ich soetwas immer mit neuen variablen und For-Schleifen etc. gelöst...aber ich bin der meinung, dass das doch auch effizienter/einfacher gehen sollte?

Wäre nett wenn ihr mir helfen könntet!!

Vielen Dank!

Gruß Kerstin


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 20.09.2012, 17:11     Titel:
  Antworten mit Zitat      
Hallo

so :

Code:

textdata = arrayfun(@(x){x.textdata(2:end)},mystruct);
textdata = [textdata{:}]
textdata = cellfun(@(x)x(1:10), textdata)
datenum(textdata,'dd.mm.yyyy')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Kerstin87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2012, 09:57     Titel:
  Antworten mit Zitat      
Hee denny,

danke für die schnelle Antwort! Es funktioniert noch nicht ganz also:

Code:

textdata = arrayfun(@(x){x.textdata(2:end)},mystruct);
textdata = [textdata{:}]
 

Bis hierhin gehts wobei beim letzten Struct welches eingelesen wird, eine cell entsteht welche die größe der beiden structfelder hat. Der Inhalt der ersten Spalte wird zwar richtig übernommen anschließend aber auch noch der Header der nächsten Spalte und ab dann nur noch Leerfelder (?). Woher kommt das denn?

Zumindest wollte ich den Rest deines Codes ausprobieren und habe die cell textdata dann händisch auf die richtige größe "gestutzt".
Bei

Code:

textdata = cellfun(@(x)x(1:10), textdata)

bekomme ich

Zitat:
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.


Okay kein Problem dachte ich und versuchte

Code:

 textdata2 = cellfun(@(x)x(1:10), textdata, 'UniformOutput', false);
 

und bekam als Fehler

Zitat:

??? Index exceeds matrix dimensions.

Error in ==> @(x)x(1:10)


Okay textdata ist nun eine celle und die Zellinhalte rufe ich ja mit

Code:
textdata{1,1}(1,1:10)
textdata{1,2}(1,1:10)
.
.
textdata{1,n}(1,1:10)
 

auf, aber mir gelingt es nun nach mehrmaligem ausprobieren nicht nur
das Datum aus den Cellinhalten zu extrahieren.

Hast du eine idee?

Danke schonmal bis hierhin! Auf obigen Code wäre ich so nicht gekommen!!


Gruß Kerstin
 
Kerstin87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2012, 10:04     Titel:
  Antworten mit Zitat      
Ich muss mich zu oben leicht korrigieren.

Es wird nach
Code:

textdata = arrayfun(@(x){x.textdata(2:end)},mystruct);
 

immer ein Cell-array erstellt welches die größe beider struct-felder hat und nach dem inhalt der ersten Spalte noch den header der zweiten spalte mit kopiert und dann nur noch leere felder hat.

gruß kerstin
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.09.2012, 13:30     Titel:
  Antworten mit Zitat      
Hallo

kannst zur Verständnis Inhalt so einer Cell posten?
Private Nachricht senden Benutzer-Profile anzeigen
 
Kerstin87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2012, 09:41     Titel:
  Antworten mit Zitat      
hee denny,

vielen Dank für deine Bemühungen. Ich habe das nach einigem herumprobieren mittlerweile selbst gelöst bekommen.
Hier der code für diejenigen die es interessiert:

Code:

    textdata = arrayfun(@(x){x.textdata(2:end,1)},mystruct);

    xvalues= cat(1,textdata{:});
   
    data = arrayfun(@(x){x.data(:,1)},mystruct);
   
    yvalues= cat(1,data{:});
   
    datums = cellfun(@(x)x(1:10),xvalues, 'UniformOutput', false);
   
    datenum(datums,'dd.mm.yyyy') ;
 
 
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.