Habt Ihr eine Ahnung, woran das liegt? Wenn ich kein Multiselect nehme und dann dementsprechend nur eine Datei auswähle, kommt die Felhermeldung nicht.
Verfasst am: 21.11.2012, 18:18
Titel: Re: index out of bounds
Hallo Inferno87,
Die Fehlermeldung ist eigentlich klar, oder?
Offenbar hat eine Zeil im Programm nur ein Zeichen. Dann scheitert "Line(2)" natürlich.
Eine einfache Methode, um solche Fehler zu finden, ist:
Dann startet man das Programm wieder und Matlab stoppt sobald der ein Fehler auftritt. Dann kann man in WorkSpace-Browser oder im CommandWindow die Werte der benutzten Variablen testen.
"Line(2)=='''' " sieht verwirrend aus. Ich bevorzuge: "if Line(2) == char(39)".
Leider ist es sehr schwierig in Forum über leere Strings zu schreiben.
Zitat:
An der Stelle, an der der Fehler auftritt hat Line aber den Wert ".
Nun könnte dies heißen, dass "Line" aus zwei Quotes besteht, also "char([39, 39])", aber auch, dass "Line" ein leerer String ist, also "char([])", da im Commandwindow Strings in Quotes eingeschlossen werden.
In letzterem Fall ist "Line" leer und der Test des zweiten Elements muss scheitern.
Okay, also meine trail.sub sieht erst mal so aus (ich hab die mal ein wenig verändert und die Quotes am Anfang entfernt und suche erst mal nur noch nach "global":
die Art und Weise, wie Du die Dateien liest, ist einfach sehr fehleranfällig.
in trail.sub können Leerzeilen enthalten sein, ein der Datei die Du bei
fid geöffnet hast nicht, und schon tritt der Fehler im ersten Fall auf.
Mit line[idxA:idxB] bestimmte Bereiche einer Zeile auszuschneiden ist
der zweite unnötige Stolperstein. Meist liegt den Zeilen doch ein bestimmtes
Muster und nicht eine feste Spalteneinteilung zugrunde.
Warum die ersten 100 Zeilen?
Warum dann mit while und nicht mit for?
Wird trail.sub aus den anderen Dateien erzeugt, nur um sie gemeinsam
einlesen zu können? Das geht einfacher und eleganter.
ich bin im Umgang mit Matlab noch sehr junfräulig, deshalb machs ichs halt immer ein bischen komplizierter;)
ja, trail.sub wird erzeugt, um Datei1 und Datei2 zusammen zufügen, um dann aus dieser trail.sub die informationen herauszusuchen (was ja nicht funktioniert)
Zitat:
Mit line[idxA:idxB] bestimmte Bereiche einer Zeile auszuschneiden ist
der zweite unnötige Stolperstein. Meist liegt den Zeilen doch ein bestimmtes
Muster und nicht eine feste Spalteneinteilung zugrunde.
Die Dateien sind komplizieretr aufgebaut. An einer Stelle stehen Koordinanten, die ich rausfiltern möchte. Und das von mehreren Dateien, die ich über Multiselect eingebe.
Diese nacheinander abzuarbeiten hat nicht so recht funktioniert, deshalb wollte ich erst beide in eine Datei kopieren und dann diese Datei auslesen.
Ohne Multiselect hats auch ganz gut funktioniert.
Zitat:
Warum die ersten 100 Zeilen?
Warum dann mit while und nicht mit for?
Hioer ist das Problem, dass links ein Skalar steht und rechts ein [1x2] Vektor. Das läuft zwar, weil Matlab automatisch ein ALL() einfügt, aber das mach whrscheinlich nicht das, was Du denkst.
Dies liest alle Zeichen aus dem File. Danach steht der Lese-Pointer auf dem File-Ende. Das erneute Lesen mit fgetl() gibt dann -1 zurück - siehe "help fgetl".
Hioer ist das Problem, dass links ein Skalar steht und rechts ein [1x2] Vektor. Das läuft zwar, weil Matlab automatisch ein ALL() einfügt, aber das mach whrscheinlich nicht das, was Du denkst.
Aber bei einer einzelnen Datei funktioniert es ja. Also denke ich schon, dass es das macht, was ich denke
Zitat:
Dies liest alle Zeichen aus dem File. Danach steht der Lese-Pointer auf dem File-Ende. Das erneute Lesen mit fgetl() gibt dann -1 zurück - siehe "help fgetl".
Genau, "Line" steht dann auf dem Wert -1, wenn Matlab abbricht. Wie kann ich den Lese-Pointer wieder zum anfang bringen? Das müsste es ja lösen, oder?
Zitat:
am besten lagerst Du das Lesen einer Datei in eine Funktion aus.
Also ich bekomme da den Fehler "Function definitions are not permitted in this context."
Hab bisher noch nicht richtig mit functions gearbeitet und weiß daher nicht so richtig, damit umzugehen.
Die von dir beschreibene function macht quasi das selbe, was ich unten mit
es funktioniert zwar, ist aber etwas unschön.
Ich würde deshalb trotzdem gerne verstehen, was ihr mir da vorgeschlagen habt, denn damit funktioniert es bei mir überhaupt nicht.
Ich habe immer noch nicht herausbekommen, was Du mit "if Line(2) == ''''" genau erreichen möchtest. Soll der zweite Buchstabe ein Quote sein? "if Line(2) == char([39, 39])" testet zweimal, ob der zweite Buchstabe ein Quote ist. Das ist irgendwie merkwürdig.
Code:
[Dateiname, Pfad] = uigetfile('*sub','Bitte ADAMS- Datei auswählen!','Multiselect','On');
Dateiname = cellstr(Dateiname); %konvertieren in cellstr
k=1;
for y=1:length(Dateiname) % y=1; NEIN! Nicht den Schleifenzähler innerhalb der Schleife ändern!
fid = fopen([Pfad Dateiname{y}]);
if fid == -1, error('Cannot open file'); end% *Always* check success!!!
iflength(Line) < 2 disp('Short line found');
elseifLine(2) == char(39);
Data{k,1} = Line(3:25);
Data{k,2} = Line(50:60);
Data{k,3} = Line(61:70);
Data{k,4} = Line(end-6:end);
Data{k,5} = '';
k=k+1;
end end % Nun muss noch irgendetwas mit Data geschehen. end
Soll der zweite Buchstabe ein Quote sein? "if Line(2) == char([39, 39])" testet zweimal
Gesucht wird nach einem ' . Korrekt ist also char(39)- das "if Line(2) == char([39, 39])" war nur zum testen und stand blöderweise noch drin.
Was genau macht Matlab mit deinem code anders?
- es prüft, ob "Line" mehr als 2 Zeichen hat
- es prüft, ob das Ende der Datei erreicht ist
oder? Das sollte ja nix an der Funktionalität an sich ändern!?
Der Test "if x == [y, y]" macht im Falle eines skalaren x und y das gleiche wie "if x == y". Aber für nicht skalare Werte ist dies ein Unterschied. Deshalb sollte man sich zur Gewohnheit machen, IF nicht mit Vektor-wertigen Bedingungen zu benutzen. Ein ALL oder ANY hilft dann explizit festzulegen, welches Verhalten man möchte.
Zitat:
Bei einer Zeilenzahl von über 441 bricht Matlab aber mit dem Fehler
??? Index exceeds matrix dimensions.
Error in ==> Kopplung_2 at 48
Data{k,3} = Line(61:70);
Dies bedeutet, dass die Zeile 441 weniger als 70 Zeichen hat. Auch hier würde "dbstop if error" helfen, diesen Fehler zu analysieren. Die Benutzung des Debuggers sollte unbedingt erfolgen, bevor man das Forum befragt. Zwar gibt es hier eine Menge Knowhow, aber der Debugger ermöglicht den Zugriff auf die Werte der Variablen, was im Foprum nur über den Umweg möglich ist, dass Du diese Werte postests -- nachdem Du sie per Debugger erhalten hast!
Die Benutzung des Debuggers sollte unbedingt erfolgen, bevor man das Forum befragt. Zwar gibt es hier eine Menge Knowhow, aber der Debugger ermöglicht den Zugriff auf die Werte der Variablen, was im Foprum nur über den Umweg möglich ist, dass Du diese Werte postests -- nachdem Du sie per Debugger erhalten hast!
Das mit dem Debugger war mir nicht bekannt. Das habe ich erst durch diesen thread erfahren.
Der fehler lag allersings daran, dass in dem Dokument an einer anderen Stelle " ' " standen und Matlab deshalb abgebrochen hat.
Hab ihm jetzt einfach gesagt, er soll an dieser Stelle das Programm beenden.
Danke für die Hilfe
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
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.