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

index out of bounds

 

Inferno87
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2012, 17:33     Titel: index out of bounds
  Antworten mit Zitat      
Hi Leute,

Ich versuche 2 Dateien mittels Multiselect auszuwählen, in einer Datei zusammen zufügen und mit dieser Datei dann weiter zu arbeiten.

Jedoch kommt bei mir dann die Fehlermeldung:

??? Attempted to access Line(2); index out of bounds because numel(Line)=1.

Error in ==> Kopplung at 39
if Line(2)=='''' ;



Code:

[Dateiname, Pfad] = uigetfile('*sub','Bitte ADAMS- Datei auswählen!','Multiselect','On');



                       
 %% Alle Dateien Zusammenfügen, um aus der Gesamtdatei zu lesen
 fid_trail=fopen('trail.sub','a');

 Dateiname =cellstr(Dateiname); %konvertieren in cellstr

 
  for y=1:length(Dateiname)
   
  y=1;

    fid = fopen([Pfad Dateiname{y}]);
   if fid == -1, error('Cannot open file'); end   % *Always* check success!!!
         
    Matrix=fread(fid);
   fwrite(fid_trail,Matrix);
      end

%% ADAMS Datei auslesen
   
x=1;
k=1;
    while x<100
   Line=fgetl(fid_trail);
      if Line(2)=='''' ;
         
       Data(k,1)=cellstr (Line(3:25));
       Data(k,2)=cellstr (Line(50:60));
       Data(k,3)=cellstr (Line(61:70));
       Data(k,4)=cellstr (Line(end-6:end));
       Data(k,5)=cellstr ('');
         
       k=k+1;    
      end
x=x+1;  
   
    end


 


Habt Ihr eine Ahnung, woran das liegt? Wenn ich kein Multiselect nehme und dann dementsprechend nur eine Datei auswähle, kommt die Felhermeldung nicht.

Danke und Grüße

Inferno
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.11.2012, 18:18     Titel: Re: index out of bounds
  Antworten mit Zitat      
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:
Code:

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)".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2012, 18:31     Titel:
  Antworten mit Zitat      
Ahoi,

also

Code:

 if Line(2)==''''
 


soll ja heissen, wenn an 2ter Stelle ein ' steht, soll die Zeile ausgelesen werden.

Das merkwürige ist, wie gesagt, dass es funkrioniert, wenn ich folgendes auskommentiere und fid_trail zu fid ändere:
Code:

%% zu lesende Datei wählen

[Dateiname, Pfad] = uigetfile('*sub','Bitte ADAMS- Datei auswählen!','Multiselect','On');
                     
 %% Alle Dateien Zusammenfügen, um aus der Gesamtdatei zu lesen
 fid_trail=fopen('trail.sub','a');

 Dateiname =cellstr(Dateiname); %konvertieren in cellstr

 
  for y=1:length(Dateiname)
   
  y=1;

    fid = fopen([Pfad Dateiname{y}]);
   if fid == -1, error('Cannot open file'); end   % *Always* check success!!!
         
%     Matrix=fread(fid);
%    fwrite(fid_trail,Matrix);
      end

%% ADAMS Datei auslesen
   
x=1;
k=1;
    while x<100
   Line=fgetl(fid);
      if Line(2)=='''' ;
         
       Data(k,1)=cellstr (Line(3:25));
       Data(k,2)=cellstr (Line(50:60));
       Data(k,3)=cellstr (Line(61:70));
       Data(k,4)=cellstr (Line(end-6:end));
       Data(k,5)=cellstr ('');
         
       k=k+1;    
      end
x=x+1;  
   
    end
 



An der Stelle, an der der Fehler auftritt hat Line aber den Wert ".

Ich versteh nicht ganz, warum MAtlab dann abbricht.

Danke und Grüße!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.11.2012, 18:39     Titel:
  Antworten mit Zitat      
Hallo Inferno87,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2012, 19:18     Titel:
  Antworten mit Zitat      
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":

global ' 'single ' 250.0 0.0 -175.0
arblink_to_bellcrank ' 'left/right' -635.0 -250.0 600.0
arb_bushing_mount ' 'left/right' 377.0 -127.0 -73.4


wenn ich
Code:

if Line(2) == char([39, 39]);
 

oder
Code:

if Line(1) == 'g';
 



schreibe, tritt der Fehler immer noch auf. Beim 2ten elelrdings wird angezeigt Line =''.

Demzufolge ist "Line" leer. Aber warum?

Wenn ich die Befehle
Code:

   A=fread(fid);
    fwrite(fid_trail,A);
 


auskommentiere geht es ja
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2012, 20:03     Titel:
  Antworten mit Zitat      
Hallo Inferno,

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.

Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2012, 20:24     Titel:
  Antworten mit Zitat      
Hi,

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?


Okay stimmt, das macht sich mit for besser.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.11.2012, 23:42     Titel:
  Antworten mit Zitat      
Hallo Inferno87,

Code:
if Line(2) == char([39, 39]);

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.

Code:

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".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2012, 00:24     Titel:
  Antworten mit Zitat      
Hallo Inferno,

am besten lagerst Du das Lesen einer Datei in eine Funktion aus.
Code:

function data = read_myfile(filename)
  fid = fopen(filename);
  if fid == -1, error('Cannot open file'); end   % *Always* check success!!!
  tline = fgetl(fid);
  data = cell();
  while ischar(tline)
    data{end+1} = process_line(tline);
    tline = fgetl(fid);
  end

function result = process_line(line)
  % und hier das Parsen einer Zeile
 


und im Hauptteil:
Code:

[Dateinamen, Pfad] = uigetfile('*sub','Bitte ADAMS- Datei auswählen!','Multiselect','On');
                     
% Alle Dateien lesen
daten = {}
for y=1:length(Dateinamen)
  daten = [daten ; read_myfile(fullfile(Pfad,Dateinamen{y}))];
end
 


Dadurch wird der Code viel strukturierter und einfacher zu testen.
So kannst Du zum Beispiel in process_line einfach eine Test-Zeile
füttern:
Code:
process_line('eine Beispiel Zeile')


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2012, 10:53     Titel:
  Antworten mit Zitat      
Zitat:
Hallo Inferno87,

Code:
if Line(2) == char([39, 39]);

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 Smile
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
Code:

k=1;
    for x=1:100
   Line=fgetl(fid);
           
       if Line(1) == '''';

     
       Data(k,1)=cellstr (Line(3:25));
       Data(k,2)=cellstr (Line(50:60));
       Data(k,3)=cellstr (Line(61:70));
       Data(k,4)=cellstr (Line(end-6:end));
       Data(k,5)=cellstr ('');
         
       k=k+1;    
      end
 
   
    end
 

versucht habe, okay...aber wie starte ich die function dann?

Sorry für meine "lange Leitung", aber ich bin noch etwas begriffsstutzig, was programmieren anbgeht.

Vielen Dank und Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2012, 13:56     Titel:
  Antworten mit Zitat      
Hi Leute,

also ich habs jetzt anders hinbekommen, indem ich das Zeilenweise auslesen einfach mit in die Schleife gepackt habe:


Code:
%% zu lesende Datei wählen

[Dateiname, Pfad] = uigetfile('*sub','Bitte ADAMS- Datei auswählen!','Multiselect','On');
                     
 %% Alle Dateien Zusammenfügen, um aus der Gesamtdatei zu lesen


  Dateiname =cellstr(Dateiname); %konvertieren in cellstr

 k=1;
  for y=1:length(Dateiname)
      y=1;
 
     fid = fopen([Pfad Dateiname{y}]);
    if fid == -1, error('Cannot open file'); end   % *Always* check success!!!
         
     
    for x=1:100
   Line=fgetl(fid);
           
       if Line(2) == '''';

     
       Data(k,1)=cellstr (Line(3:25));
       Data(k,2)=cellstr (Line(50:60));
       Data(k,3)=cellstr (Line(61:70));
       Data(k,4)=cellstr (Line(end-6:end));
       Data(k,5)=cellstr ('');
         
       k=k+1;    
      end
 
   
    end

       end


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.

Vielen Dank und Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.11.2012, 16:21     Titel:
  Antworten mit Zitat      
Hallo Inferno87,

Der Befehl FSEEK bewegt den File-Pointer.

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!!!

  for x=1:100
    Line = fgetl(fid);
    if ~iscahr(Line)  % End-of-file
      error('Unexpected end-of-file.');
    end

    if length(Line) < 2
      disp('Short line found');
    elseif Line(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

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2012, 18:57     Titel:
  Antworten mit Zitat      
Hi Jan,


Zitat:
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!?


Ich hätte noch eine andere Frage:
UNd zwar muss
Code:
for x=1:100
    Line = fgetl(fid);
    if ~ischar(Line)  % End-of-file
      error('Unexpected end-of-file.');
    end

    if length(Line) < 2
      disp('Short line found');
    elseif Line(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


insgesamt x mal durchlaufen werden, wobei x die Anzahl der Zeilen des Dokuments ist.
Das Problem: mittels
Code:
Zeilenanzahl = length(textread(Dateiname{1}, '%s', 'delimiter', '\n'))

bekommt er die Zeilenzahl rasu, die allerding bei 505 liegt.
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);


ab. Die Größe der Matrix wurde ja aber nie begrenzt
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.11.2012, 12:10     Titel:
  Antworten mit Zitat      
Hallo Inferno87,

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!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2012, 14:13     Titel:
  Antworten mit Zitat      
Zitat:
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
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.