Verfasst am: 28.02.2017, 16:32
Titel: Index exceeds matrix dimensions
Hallo,
ich habe eine Matrix newLand, die nach Zeilen mit bestimmten Werten durchsucht wird. Wenn die entsprechenden Zeilen gefunden wurden, sollen diese in eine neue Matrix StadtLandZyklus geschrieben werden und aus newLand gelöscht werden. Vom Prinzip werden hier Elemente gezogen, ohne dass diese zurückgelegt werden.
Ich erhalte die Fehlermeldung "Index exceeds matrix dimensions" und kann mir nicht erklären, warum?
In einem ähnlichen Code, wo das gleiche Prinzip durchgeführt wird, bekomme ich die Fehlermeldung nicht. Auch wenn ich den unten stehenden Code mit Zurücklegen habe, erscheint der Fehler nicht.
Hier ist mein Code:
Code:
% Konstruktion des Stadt-Land-Zyklus mit hohem Partikelausstoss % Version, die beim hypothetischen Stadt-Land-Zyklus untersucht, ob die % Verteilung im Intervall der Leistungsklassen liegt und die Micro-Segmente % werden nicht zurückgelegt.
% Der StadtZyklus wird eingelesen
StadtLandZyklus= StadtZyklus;
% Vector mit Leistungsklassen, die generell vorkommen.
LeiKla= [2;3;4;5;6;7;8;9];
% Ermittelt die Leistungsklassen des bisherigen Zyklus
LKnewMicroSeg = unique(StadtLandZyklus(:,29));
%Abfrage der Toleranz für die Geschwindigkeit zwischen den Micro-Segmenten
%+/- 1 km/h ist ein guter Anfang.
speedTol = input('Bitte Toleranz für die Geschwindigkeit zwischen zwei Micro-Segmenten eingeben: ');
s=16;
%Abfrage der Streckenlänge [km] für den Landzyklus
distance = s+input('Bitte Streckenlänge [km] für Landzyklus eingeben: ');
% Schleife, welche die Micro-Segmente aneinanderreiht.
% Berechnet die gesamte Häufigkeiten aller Leistungsklassen.
b= size(StadtLandZyklus,1);
% Berechnet die Häufigkeit jeder Leistungsklasse aus dem bisher erstellten % Zyklus. k= Häufigkeiten, klasse= Leistungsklasse [k, klasse] = hist(StadtLandZyklus(:,29), LeiKla);
% Matrix kl mit Übersicht der Anzahl von Klassen.
kl= [klasse, k', zeros(size(klasse,1),1)];
% Berechnung des relativen Anteils jeder Leistungsklasse in dem bisher % erstellen Zyklus. for i= 1:size(kl,1)
kl(i,3)= kl(i,2)/b;
end % Der gegenwärtig relative Anteil jeder Leistungsklasse wird einer % Variablen zugeordnet.
LK2ist= kl(kl(:,1)==2,3);
LK3ist= kl(kl(:,1)==3,3);
LK4ist= kl(kl(:,1)==4,3);
LK5ist= kl(kl(:,1)==5,3);
LK6ist= kl(kl(:,1)==6,3);
LK7ist= kl(kl(:,1)==7,3);
LK8ist= kl(kl(:,1)==8,3);
LK9ist= kl(kl(:,1)==9,3);
% Ermittlung des Status jeder Leistungsklasse: 0= Anteil der % Leistungsklasse zu gering, 1= Anforderung der Leistungsklasse % erfüllt, 2= Anteil der Leistungsklasse überschritten.
%Status Leistungsklasse 2 if LK2ist >= SLuLimLK2 && LK2ist <= SLoLimLK2
LK2soll=1;
end if LK2ist > SLoLimLK2
LK2soll=2;
end if LK2ist < SLuLimLK2
LK2soll=0;
end
%Status Leistungsklasse 3 if LK3ist >= SLuLimLK3 && LK3ist <= SLoLimLK3
LK3soll=1;
end if LK3ist > SLoLimLK3
LK3soll=2;
end if LK3ist < SLuLimLK3
LK3soll=0;
end
%Status Leistungsklasse 4 if LK4ist >= SLuLimLK4 && LK4ist <= SLoLimLK4
LK4soll=1;
end if LK4ist > SLoLimLK4
LK4soll=2;
end if LK4ist < SLuLimLK4
LK4soll=0;
end
%Status Leistungsklasse 5 if LK5ist >= SLuLimLK5 && LK5ist <= SLoLimLK5
LK5soll=1;
end if LK5ist > SLoLimLK5
LK5soll=2;
end if LK5ist < SLuLimLK5
LK5soll=0;
end
%Status Leistungsklasse 6 if LK6ist >= SLuLimLK6 && LK6ist <= SLoLimLK6
LK6soll=1;
end if LK6ist > SLoLimLK6
LK6soll=2;
end if LK6ist < SLuLimLK6
LK6soll=0;
end
%Status Leistungsklasse 7 if LK7ist >= SLuLimLK7 && LK7ist <= SLoLimLK7
LK7soll=1;
end if LK7ist > SLoLimLK7
LK7soll=2;
end if LK7ist < SLuLimLK7
LK7soll=0;
end
%Status Leistungsklasse 8 if LK8ist >= SLuLimLK8 && LK8ist <= SLoLimLK8
LK8soll=1;
end if LK8ist > SLoLimLK8
LK8soll=2;
end if LK8ist < SLuLimLK8
LK8soll=0;
end
%Status Leistungsklasse 9 if LK9ist >= SLuLimLK9 && LK9ist <= SLoLimLK9
LK9soll=1;
end if LK9ist > SLoLimLK9
LK9soll=2;
end if LK9ist < SLuLimLK9
LK9soll=0;
end
%Liest die Geschwindigkeit am Ende des vorangegangenen Micro-Segments
%ein.
%Sucht ein neues Micro-Segment mit Startgeschwindigkeit +/- Toleranz
%zur Endgeschwindigkeit des vorangegangenen Micro-Segments. Sobald
%dieser gefunden ist, stoppt die Suche. Dadurch wird immer das nächst
%mögliche Micro-Segment mit hohem Emissionsaustoß gefunden. Denn in
%Matirx newStadt sind die Micro-Segmente absteigend nach Emissionen
%sortiert.
for i2 = 1:size(newLand,1)
%Prüft die Startgeschwindigkeit jedes Micro-Segments mit
%der Toleranz +/- 0.1 km/h. Identifiziert wird der Start
%des Segments durch eine Null in Spalte 6.
if newLand(i2,10) <= (speed+speedTol) && newLand(i2,10) >= (speed-speedTol)&& newLand(i2,6) == 0 && newLand(i2+1,6) == 1 && newLand(i2,4) == newLand(i2+1,4) % Erste Zeile des neuen Micro-Segments wird erstellt.
newMicroSeg= newLand(i2,:);
%Liest die zugehörigen Zeilen des Micro-Segments aus,
%dazu wird die Nr. des Micro-Segments ausgelesen.
addMicroSeg= newLand(:,4) == newMicroSeg(1,4);
% Auslesen des gesamten Micro-Segments
addMicroSeg= newLand(addMicroSeg,:);
% Konstruktion des hypothetischen Zyklus zur Berechnung der Leistungsklassenverteilung. Hypothetischer % Zyklus = Bisheriger Zyklus + aktuelles Micro-Segment.
hypoStadtLandZyklus = [StadtLandZyklus;addMicroSeg];
% Berechnung der Leistungsklassen aus dem hypothetischen Zyklus % Berechnet die gesamte Häufigkeiten aller Leistungsklassen.
b= size(hypoStadtLandZyklus,1);
% Berechnet die Häufigkeit jeder Leistungsklasse aus dem bisher erstellten % Zyklus. k= Häufigkeiten, klasse= Leistungsklasse [k, klasse] = hist(hypoStadtLandZyklus(:,29), LeiKla);
% Matrix kl mit Übersicht der Anzahl von Klassen.
kl= [klasse, k', zeros(size(klasse,1),1)];
% Berechnung des relativen Anteils jeder Leistungsklasse in dem bisher % erstellen Zyklus. for h= 1:size(kl,1)
kl(h,3)= kl(h,2)/b;
end % Der gegenwärtig relative Anteil jeder Leistungsklasse wird einer % Variablen zugeordnet.
LK2ist= kl(kl(:,1)==2,3);
LK3ist= kl(kl(:,1)==3,3);
LK4ist= kl(kl(:,1)==4,3);
LK5ist= kl(kl(:,1)==5,3);
LK6ist= kl(kl(:,1)==6,3);
LK7ist= kl(kl(:,1)==7,3);
LK8ist= kl(kl(:,1)==8,3);
LK9ist= kl(kl(:,1)==9,3);
% Ermittlung des Status jeder Leistungsklasse: 0= Anteil der % Leistungsklasse zu gering, 1= Anforderung der Leistungsklasse % erfüllt, 2= Anteil der Leistungsklasse überschritten.
%Status Leistungsklasse 2 if LK2ist >= SLuLimLK2 && LK2ist <= SLoLimLK2
LK2soll=1;
end if LK2ist > SLoLimLK2
LK2soll=2;
end if LK2ist < SLuLimLK2
LK2soll=0;
end
%Status Leistungsklasse 3 if LK3ist >= SLuLimLK3 && LK3ist <= SLoLimLK3
LK3soll=1;
end if LK3ist > SLoLimLK3
LK3soll=2;
end if LK3ist < SLuLimLK3
LK3soll=0;
end
%Status Leistungsklasse 4 if LK4ist >= SLuLimLK4 && LK4ist <= SLoLimLK4
LK4soll=1;
end if LK4ist > SLoLimLK4
LK4soll=2;
end if LK4ist < SLuLimLK4
LK4soll=0;
end
%Status Leistungsklasse 5 if LK5ist >= SLuLimLK5 && LK5ist <= SLoLimLK5
LK5soll=1;
end if LK5ist > SLoLimLK5
LK5soll=2;
end if LK5ist < SLuLimLK5
LK5soll=0;
end
%Status Leistungsklasse 6 if LK6ist >= SLuLimLK6 && LK6ist <= SLoLimLK6
LK6soll=1;
end if LK6ist > SLoLimLK6
LK6soll=2;
end if LK6ist < SLuLimLK6
LK6soll=0;
end
%Status Leistungsklasse 7 if LK7ist >= SLuLimLK7 && LK7ist <= SLoLimLK7
LK7soll=1;
end if LK7ist > SLoLimLK7
LK7soll=2;
end if LK7ist < SLuLimLK7
LK7soll=0;
end
%Status Leistungsklasse 8 if LK8ist >= SLuLimLK8 && LK8ist <= SLoLimLK8
LK8soll=1;
end if LK8ist > SLoLimLK8
LK8soll=2;
end if LK8ist < SLuLimLK8
LK8soll=0;
end
%Status Leistungsklasse 9 if LK9ist >= SLuLimLK9 && LK9ist <= SLoLimLK9
LK9soll=1;
end if LK9ist > SLoLimLK9
LK9soll=2;
end if LK9ist < SLuLimLK9
LK9soll=0;
end
% Wenn die jeweilige Leistungsklasse im hypothetischen Zyklus nicht im Intervall ist, dann soll das nächste % Micro-Segment gesucht werden. if LK2soll ~=1 || LK3soll ~=1 || LK4soll ~=1 || LK5soll ~=1 || LK6soll ~=1 || LK7soll ~=1 || LK8soll ~=1 || LK9soll ~=1 continue
else break %Die Suche stoppt, sobald das nächste passende Micro-Segment gefunden und hizugefügt wurde.
end end
%Fügt das neue Micro-Segment dem Stadtzyklus hinzu.
StadtLandZyklus= [StadtLandZyklus; addMicroSeg];
% Das gezogene Micro-Segment wird gelöscht
newLand(newLand(:,4)== newMicroSeg(1,4),:)=[];
% Berechnung der zurückgelegten Strecke. Relevant für die % while-Bedingung
dv= sum(StadtLandZyklus(:,10))/size(StadtLandZyklus,1);
time= size(StadtLandZyklus,1)/3600;
s= dv*time;
Ich habe mit dem Debugger geschaut, was passiert. Kann aber nichts feststellen. Meine erste Vermutung war, dass er kein passendes Objekt nach den Kriterien findet. Aber ich habe, nachdem der Code abgebrochen wurde, manuell weiter gesucht und weitere Objekte in der Matrix gefunden. Ich verstehe die Welt nicht mehr.
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.