|
|
ASCII import (nochmal), vertcat, cell2mat etc. |
|
Olsen |

Forum-Anfänger
|
 |
Beiträge: 12
|
 |
|
 |
Anmeldedatum: 15.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.02.2011, 16:23
Titel: ASCII import (nochmal), vertcat, cell2mat etc.
|
 |
|
 |
|
Hallo zusammen,
das Thema ist nicht neu. Dennoch würde ich es gern noch einmal aufgreifen.
Es geht in erster Linie um ASCII import mehrerer Dateien und das Schreiben in eine Matrix.
Die *asc files haben unterschiedlich viele Zeilen und immer 4 Spalten.
Zwei davon sind angehängt (insgesamt gibt es ziemlich viele davon).
Ascii import klappt so wunderbar:
Nur liegen jetzt die Dateien in n arrays vor. Ich möchte einen langen array mit 4 Spalten.
Nun will ich natürlich nicht
schreiben bis ich schwarz werde. Wie indiziert man hier richtig um das in einer Schleife zu lösen.
Eine potentielle Alternative um das ganze in einem Schritt zu lösen, wurde bereits in einem anderem Beitrag gezeigt:
Allerdings funktioniert das so nicht.
error(Subscripted assignment dimension mismatch)
Wurde der code hier nur falsch eingetippt? Und es muss lauten:
Dass funktioniert zumindest. Nur um auf mein Ergebnis (eine n x 4 Matrix) zu kommen muss ich dann den cell-array in eine Matrix umwandeln.
M=cell2mat(C) funktioniert nicht.
error(CAT arguments dimensions are not consistent)
Wie gehts richtig?
Alle Vorschläge sind willkommen - ich danke euch.
Grüße
Beschreibung: |
|
 Download |
Dateiname: |
ascii_Bsp.zip |
Dateigröße: |
134.9 KB |
Heruntergeladen: |
855 mal |
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 01.02.2011, 21:20
Titel:
|
 |
Hallo,
die Variante
kann logischerweise nur klappen, wenn alle Datensätze die gleiche Anzahl Zeilen haben. Wenn die Datensätze nur untereinandergeschrieben werden sollen, sollte folgendes gehen:
Eine andere Alternative wäre:
... und dann am Ende
Sollte beides funktionieren.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 02.02.2011, 00:13
Titel: Re: ASCII import (nochmal), vertcat, cell2mat etc.
|
 |
Hallo Olsen,
Haralds Antwort ist ja bereits umfassend.
Ich habe nur eine meiner kurzen Standardanmerkungen zu EVAL:
Während das EVAL weggelassen wurde, weil es hier nur verwirrt, ist das Speichern der Ausgabe von LOAD viel sicherer.
Gruß, Jan
|
|
|
Olsen |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 12
|
 |
|
 |
Anmeldedatum: 15.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 02.02.2011, 11:24
Titel:
|
 |
Ich danke euch beiden. Die Varianten funktionieren. Folgender Code läuft am schnellsten:
Jan, mit der EVAL-Zeile in der for-Schleife schreibe ich meine Dateien in einzelne arrays die dann auch so heißen wie die input-files.
Data = load(list(i).name, '-ascii') in der for-Schleife überschreibt mir in jedem Durchgang das "Data."
Leider dauert es bei mir wohl etwas länger mich mit der Matlab syntax vertraut zu machen. Sie birgt für mich Kuriositäten aus denen ich nicht schlau werde und die auch schwer in irgendwelchen Dokumentationen zu finden sind. Die Beispielsuche ist manchmal etwas mühsam.
z.B.
Die Leerzeichen innerhalb der Hochkommata sind offensichtlich essentiell. Wo ist sowas dokumentiert? Habt ihr da noch einen guten Tip?
Mit besten Grüßen
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 02.02.2011, 11:47
Titel:
|
 |
|
 |
|
Hallo,
Zitat: |
Data = load(list(i).name, '-ascii') in der for-Schleife überschreibt mir in jedem Durchgang das "Data." |
Dann musst du auch in die linke Seite irgendwie das i reinbringen, z.B.
EVAL ist grundsätzlich problematisch, da eben schwer zu sehen ist, was MATLAB da eigentlich macht, und sollte deshalb nach Möglichkeit vermieden werden. Wenn du es aber schon nutzt, hilft folgender Trick: ersetze EVAL durch DISP und du siehst, was MATLAB genau auszuführen versucht; in dem Fall sieht das dann so aus:
Dass MATLAB Probleme hat, diesen Befehl auszuführen, sollte nachvollziehbar sein. Dass die Leerzeichen hier notwendig sind, ist nicht explizit dokumentiert, aber: MATLAB führt den String, der als Argument an EVAL übergeben wird, als Befehl aus. Und wenn in dem String die Leerzeichen fehlen, fehlen sie also auch im Befehl. UndwennmanetwasganzohneLeerzeichenschreibt,siehtesmanchmaletwaskomischaus-auchfuerMATLAB
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
_Peter_ |

Moderator
|
 |
Beiträge: 537
|
 |
|
 |
Anmeldedatum: 08.12.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: 7.10, 2010a
|
 |
|
|
 |
|
Verfasst am: 02.02.2011, 11:48
Titel:
|
 |
Hallo Olsen,
Zitat: |
Data = load(list(i).name, '-ascii') in der for-Schleife überschreibt mir in jedem Durchgang das "Data."
|
Das könntest du ohne eval lösen, indem du die Werte in einem Struct beispielsweise ablegst.
Auf die Werte kannst du dann zugreifen indem du auch den Dateinamen verwendest. Anhand deiner Beispieldateien wie folgt:
_________________
Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
|
|
|
Olsen |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 12
|
 |
|
 |
Anmeldedatum: 15.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 02.02.2011, 12:06
Titel:
|
 |
Nochmalsvielendankeuchallen - sieht doch gut aus
Alles klaro - ich habe die message verstanden.
___________
Egal was die Frage ist: Die Antwort könnte
logische Indizierung beinhalten.
tzz tzz
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 02.02.2011, 12:10
Titel:
|
 |
|
 |
|
Hallo Olsen,
EDIT: Ich habe so lange zum Schreiben gebraucht, dass einige Punkte längst von anderen beantwortet worden sind. Bitte die Redundanzen einfach ignorieren. Danke
Zitat: |
Die Leerzeichen innerhalb der Hochkommata sind offensichtlich essentiell. Wo ist sowas dokumentiert? |
Das ist gar nicht dokumentiert, da es ein Befehl ist, den sich ein User beliebig zusammenstellen kann. Zerlege doch den Befehl mal in seine Einzelteile:
Das ist einer der Gründe, warum EVAL mehr Verwirrung produziert, als dass es hilft Aufgaben zu lösen. Wenn man den Befehl gleich ohne EVAL formuliert, treten die Probleme erst gar nicht auf:
Das macht nämlich genau das selbe, verwirrt aber weniger beim Lesen und man macht auch weniger leicht Fehler.
Aber EVAL kann auch völlig unerwartete Dinge ausführen, z.B. wenn der Dateiname zufällig irgendwo ein Semikolon enthält:
Jetzt würde nämlich folgendes passieren:
Also würde mal eben überraschend Deine Festplatte formatiert werden --- falls Du mit einem völlig veralteten Windows arbeiten würdest und zudem unvporsichtigerweise als Admin angemeldet wärest. Ich poste hier mal kein wirklich funktionierendes Beispiel, aber es gibt unzählige Dinge, die EVAL beim Ausführend dazu bringen, unkontrolliert Dinge zu zerstören, die man eigentlich ganz gerne noch behalten möchte.
Es war reine Absicht, dass mein "Data=load" die Variablen nicht direkt in den WorkSpace läd, weil das ganz genau wie EVAL zu extrem schwierig zu debuggenden Problemen führen kann:
Schon gibnt es keine Methode mehr, um sicher vorherzusagen, welchen Wert [a] hat! Es könnte nämlich durchaus eine Variable Namens "sin" im MAT-File stehen, die nach LOAD die Funktion "sin" verdeckt. Das passiert überraschend oft mit dem Namen "max", den Anfänger schon mal gerne verwenden - solange, bis ihnen die Programme um die Ohren fliegen.
Wenn man aber die Ausgabe von LOAD in einer Variablen speichert, ist alles schön an seinem Platz:
Wenn man nun verschiedene Files laden möchte, sollte man das besser in einem Cell-Array speichern, oder als unterschiedliche Felder in einem Struct.
Die funktionelle Form der Befehle ist immer sicherer, weil die nicht-funktionelle Form (wie nennt man die offiziell) auf "intelligente" Weise interpretiert wird -- zu Deutsch: Es kann Blödsinn heraus kommen:
Ich könnte nun hundert andere kuriose Beispiele posten, die dann auch noch je nach Matlab-Version unterschiedlich interpretiert werden. Aber ich fasse der Einfachheit halber zusammen:
EVAL, LOAD ohne Output und die nicht-funktionelle Form der Befehle beinhalten so viele Tücken, dass sie in einem zuverlässigen Programm nicht vorkommen sollten.
Und viele dutzend, eher viele hundert Anfänger habe das bereits erlebt und nach verblüffenden Schwierigkeiten in diesem und anderen Foren nach Hilfe gesucht.
Viel Spaß beim Programmieren in Matlab, Jan
|
|
|
Olsen |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 12
|
 |
|
 |
Anmeldedatum: 15.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 02.02.2011, 21:15
Titel:
|
 |
Hallo Jan,
vielen Dank für deine Mühe mir das so ausführlich zu erläutern. Habe ja schon aus anderen Beiträgen entnommen, dass EVAL kritisch zu sehen ist.
Ich werde in Zukunft die Finger davon lassen.
Für manche Leute ist "...Spaß beim Programmieren..." ein Widerspruch in sich Da ist wohl dranbleiben angesagt. Wenns läuft, ist es ja durchaus spaßig.
Grüße
Olsen
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 03.02.2011, 13:33
Titel:
|
 |
Hallo Olsen,
Zitat: |
vielen Dank für deine Mühe mir das so ausführlich zu erläutern. |
Ich habe den Eindruck, wenn ich es einmal erkläre (oder einmal am Tag?), erspart es 10 Threads mit diesbezüglichen Fragen in der Zukunft und viele Stunden Grübelzeit bei den Programmierenden.
Zitat: |
Für manche Leute ist "...Spaß beim Programmieren..." ein Widerspruch in sich |
So fühlten sich die MathWorks-Programmierer, als sie nach einer langen Diskussionsnacht die Funktion WHY in die Toolboxen eingefügt haben:
Gruß, Jan
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|