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

cell arrays, Indizierung und cellfun, Verständnisproblem

 

LarsVegas
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.07.13
Wohnort: Almería
Version: R2012b
     Beitrag Verfasst am: 12.07.2013, 15:02     Titel: cell arrays, Indizierung und cellfun, Verständnisproblem
  Antworten mit Zitat      
Hallo liebe Forumsmitglieder,

auch nach einiger Zeit des Arbeitens mit Matlab, tauchen bei mir immer wieder Probleme bei der Verwendung von cell arrays auf. Hier mein aktuelles Problem, wobei ich hoffe dass dieses als gutes Beispiel dienen könnte, um die Zusammenhänge endlich auch allgemein besser zu verstehen:

Angenommen ich habe einen cell array, welcher character strings beinhaltet. In der Realität entstammt dieser aus dem Einlesen von Textdateien, aber der Einfachheit wegen können wir ihn ja auch manuell erstellen.

Code:

array= cell(3,1);
array{1,1} = '"2013-07-12 12:02:00",Wert1,Wert2,Wert3';
array{2,1} = '"2013-07-12 12:01:00",Wert1,Wert2,Wert3';
array{3,1} = '"2013-07-12 12:03:00",Wert1,Wert2,Wert3';
 


Wi man sehen kann, beginnt jede Textzeile mit einem timestamp. Da ich gerne die Zeilen chronologisch sortieren würde, wäre es naheligend die timestamps in das datevec-Format umzuwandeln und anschließend zu vergleichen. Einen datevec kann man z.B. wie folgt erstellen:

Code:

zeitvektor = datevec(array{1,1}(2:20));
 


Dazu habe ich mir überlegt eine Matrix zu erstellen, in die ich die Elemente der datevecs speichern und anschließend mit sortrows sortieren möchte:

Code:

matrix(1:3,2:7) = 1:3;
 


Natürlich könnte man nun eine for-Schleife verwenden um der Reihe nach die datevec-Elemente in die Matrix zu schreiben, in etwa so:

Code:

for idx = 1:3
matrix(idx,1) = datevec(array{idx,1}(2:20));
end
 


Dies ist bei sehr großen Datenmengen allerdings nicht besonders vorteilhaft was die Rechengeschwindigkeit angeht. Daher hätte ich intuitiv versucht es so zu lösen:

Code:

matrix(1:3,2:7) = datevec(array{1:3,1}(2:20));
 


Dies ist offenbar, wie ich nun auch schon an anderer Stelle nachlesen konnte, mit Matlab nicht möglich, da Matlab auf eine "Bad cell reference operation." verweist.

Gibt es also eine Alternative zur for-Schleife, bzw. ein eleganteres Vorgehen? Ich könnte mir vorstellen dass z.B. cellfun hier helfen könnte, allerdings habe ich bis heute nicht verstanden, wie genau ich diese Funtion anzuwenden habe.

Für eure Hilfe und Anmerkungen, die mein allgemeines Verständnis verbessern, wäre ich euch sehr dankbar!

Grüße
Lars
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.07.2013, 16:02     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich könnte mir vorstellen dass z.B. cellfun hier helfen könnte, allerdings habe ich bis heute nicht verstanden, wie genau ich diese Funtion anzuwenden habe.

Die Dokumentation liefert umfassende Erklärungen. Hier wäre es besser, wenn du konkrete Fragen hast und stellst.

Im speziellen Fall würde ich das machen:
Code:
datestrings = cellfun(@(d) d(2:20), array, 'UniformOutput', false)


Im übrigen würde ich datenum statt datevec verwenden, da sich das Ergebnis davon noch leichter sortieren lässt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
LarsVegas
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.07.13
Wohnort: Almería
Version: R2012b
     Beitrag Verfasst am: 12.07.2013, 16:31     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke dass du so schnell geantwortet hast! Deine Antwort hat mir auch bestens geholfen und mir die Augen ein Stück weit geöffnet!

Die Matlab-Hilfe ist meistens wirklich super, aber wenn man einen Teil einfach nicht versteht, bringt es auch nichts ihn wieder und wieder zu lesen. Manchmal hilft es schon das Gleiche in anderen Worten auszudrücken, deshalb war meine Frage an der Stelle vielleicht etwas zu unpräzise, aber deine kurze Antwort hat mir da super geholfen. Nun muss ich auch zugeben, dass es fast das gleiche Problem dort sogar als Beispiel gab, aber ich bin einfach nicht drauf gekommen!

Okay, nun dann aber doch noch einmal eine etwas speziellere Frage: Das 'd' ist bei dir so wie ich es nun verstehe Teil einer anonymen Funktion und das heißt lediglich, dass es keine von Matlab implementierte Funktion und auch keine selbstgeschriebene und als m-file hinterlegte Funktion ist, sondern dass sie quasi an Ort und Stelle definiert ist, richtig? Die Bezeichnung 'd' kann dann also willkürlich gewählt werden. Darauf wäre ich so einfach nicht gekommen... Dort könnte man dann auch kompliziertere Funktionen einsetzen, z.B. mit richtigen Rechenoperationen?

Zum Abschluss noch die Erklärung des datevec-Formats: Ich kenne auch das datenum-Format, allerdings bereitet dieses durch Ungenauigkeiten/Rundungsfehler immer wieder Probleme, wenn man z.B. zwei timestamps auf Gleichheit überprüfen will. Mit derartigen Problemen habe ich mich schon oft auseinandergesetzt, sodass ich irgendwann dazu übergegangen bin datevec zu benutzen. Da passieren solche Fehler bei der Umwandlung aus character strings nicht und man kann sie ganz bequem mit isequal vergleichen.

Danke noch einmal für deine Antwort

Grüße
Lars
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.07.2013, 16:57     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Das 'd' ist bei dir so wie ich es nun verstehe Teil einer anonymen Funktion und das heißt lediglich, dass es keine von Matlab implementierte Funktion und auch keine selbstgeschriebene und als m-file hinterlegte Funktion ist, sondern dass sie quasi an Ort und Stelle definiert ist, richtig? Die Bezeichnung 'd' kann dann also willkürlich gewählt werden.

Genau

Zitat:
Dort könnte man dann auch kompliziertere Funktionen einsetzen, z.B. mit richtigen Rechenoperationen?

Ja. Wenn die anzuwendende Funktionalität aber nicht mehr bequem in eine Zeile passt, würde ich das ganze in eine .m-Datei (oder, falls du das in einer Funktion brauchst, als Unterfunktion - in jedem Fall aber als separate Funktion) schreiben. Das ist dann übersichtlicher.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
LarsVegas
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.07.13
Wohnort: Almería
Version: R2012b
     Beitrag Verfasst am: 12.07.2013, 16:59     Titel:
  Antworten mit Zitat      
Gut zu wissen, nun habe ich also sogar neben cellfun auch noch die anonymen Funktionen kennengelernt! Very Happy Danke und ein schönes Wochenende!
Private Nachricht senden Benutzer-Profile anzeigen
 
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.