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

Fehlersuche: ??? Index exceeds matrix dimensions.

 

anaise
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 22.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.10.2013, 11:01     Titel: Fehlersuche: ??? Index exceeds matrix dimensions.
  Antworten mit Zitat      
Hallo Smile

Ich sitze nun seit ewigkeiten an meinem Skript und bekomme an einer Stelle die Fehlermeldung: ??? Index exceeds matrix dimensions.

Das Skript soll vergleichen ob Werte der Variable all1_sac (j,1) zwischen zwei Werten in all1 ( all1(i,2) & all1(i+3,2)) liegen und dann die Werte der beiden folgenden Spalten in dieser Zeile in all1_sac übertragen.
Problematisch ist das all1 irgendwann endet, all1_sac aber noch Werte vergleichen will. Der Wert in all1_sac übersteigt in diesem Fall immer den letzten Wert von all1. Ich habe versucht das mit elseif & brake zu lösen, was in vorherigen Schleifen, die genau so aufgebaut sind und nur auf andere Varialbelen zugreifen funktioniert hat. Jetzt bleibt die Fehlermeldung jedoch bestehen. Und das macht mich WAHNSINNIG!
Ok. Ich würde mich also sehr über Fehlerhinweise freuen oder auch über elegantere Lösungen, da mein Repertoire noch nicht wirklich groß ist.


Code:
% Teil des Skripts mit Fehlermeldung:

for j=1:length(all1_sac)
   all1_sac(j,2)=0;
     for i=1:length(all1)                                                
       if (all1_sac(j,1)>= all1(i,2)) && (all1_sac(j,1) <=all1(i+3,2))      
           all1_sac(j,2)=all1(i,3);                                        
           all1_sac(j,3)=all1(i,4);
       elseif all1_sac(j,1)> all1(length(all1),2)
           break
       end                                                        
    end        
end
 
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: 09.10.2013, 11:19     Titel:
  Antworten mit Zitat      
Hallo,

das Problem scheint mir zu sein:
Die innere for-Schleife geht von 1 bis length(all1). Das dürfte hier die Zeilenanzahl von all1 sein. Der Klarheit halber würde ich size(all1, 1) verwenden.

Du iterierst nun also über alle Zeilen, willst aber dann noch 3 Zeilen weiter gehen: all1(i+3,2). Das kann nicht klappen.

Nun weiß ich natürlich nicht, was du machen willst. Eine Abhilfe wäre:
Code:
for i=1:size(all1,1) - 3  


Eine elegantere Formulierung für solche Aufgaben ist i.d.R. logische Indizierung (logical indexing).

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 22.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.10.2013, 11:27     Titel: Danke :)
  Antworten mit Zitat      
Hallo Harald,

Danke für die schnelle Hilfe, es hat wunderbar geklappt Smile

Liebe Grüße

Anais
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



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

du musst bei FOR-Loop halt die Grenze kleiner setzen.

Wenn du den Ausdruck in der IF-Bedingung betrachtest und zwar die Stelle
all1(i+3,2). Das nämlich verursacht den Fehler.

Also muss du dein Loop also anderes Laufen lassen

Code:


% besser SIZE für Matrizen zu nutzen,
% Da LENGTH die Seite auswählt, welche am längsten ist
for j=1:size(all1_sac, 1)
   all1_sac(j,2)=0;
    % hier die Grenze anders setzen
     % wenn i+3 dann muss man 3 abziehen

     for i=1:size(all1, 1) - 3                                                
       if (all1_sac(j,1)>= all1(i,2)) && (all1_sac(j,1) <=all1(i+3,2))      
           all1_sac(j,2)=all1(i,3);                                        
           all1_sac(j,3)=all1(i,4);
       elseif all1_sac(j,1)> all1(length(all1),2)
           break
       end                                                        
    end        
end

 


Was ich mich frage, was mach das für den Sinn, die Werte zu überschreiben

Code:
          all1_sac(j,2)=all1(i,3);                                        
           all1_sac(j,3)=all1(i,4)



sollte es vielleicht nicht so sein:


Code:

for j=1:size(all1_sac, 1)
   all1_sac(j,2)=0;
   if j <= size(all1, 1)                            
      if (all1_sac(j,1)>= all1(j,2)) && (all1_sac(j,1) <=all1(j+3,2))      
          all1_sac(j,2)=all1(j,3);                                        
          all1_sac(j,3)=all1(j,4);
      end                                                      
    end  
end

 
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.