Verfasst am: 01.09.2014, 16:02
Titel: Wert wird nicht richtig in Array geschrieben
Hallo,
ich habe mit der folgenden Schleife ein Problem.
Die Funktion matchU bildet den Inhalt des Vektors state auf den Indexwert (Zeilen/Spalten) von U1 ab. i ist ein Vektor mit den Indexwerten für U1.
Die Funktion trm ermittelt die Eingangsgrößen für die Funktion rwd sowie für die Berechnung des Nutzenwerts der in U1 geschrieben wird.
Beim schreiben in U1 scheint etwas schief zu laufen. Beim ersten Schleifendurchlauf ist alles OK. Ab dem zweiten Durchlauf wird entweder garnichts in U1 geschrieben, oder aber die alten Werte mit dem aktuellen Wert überschrieben bzw. auf irgendwelche anderen Werte gesetzt. Eine richtige Systhematik kann ich dabei nicht erkennen.
Die Funktionen matchU, trm und rwd liefern die korrekten Werte. Der Vektor i enthält die richtigen Werte. Die Berechnung max(Rs + gamma*(Us'*P)') ist auch korrekt. Einzig beim Schreiben in U1 an die Stelle i läuft etwas schief.
Kann von euch jemand einen Fehler im Code erkennen oder mir Hinweise auf die Ursache des Problems geben?
Code:
for Z=state_parameter(1,1):state_parameter(1,2) for V=state_parameter(2,1):state_parameter(2,3):state_parameter(2,2) for t=state_parameter(3,1):state_parameter(3,3):(state_parameter(3,2)-state_parameter(3,3))
state = [Z V t]';
i = matchU(state, state_parameter); % Matching state auf Index von U1 [ P, S1, Z1 ] = trm( state,state_parameter,N,aktion,mdp_parameter );
% Reward für aktuellen Zustand und Nutzen der Nachfolgezustände % berechnen [ Rs, Us ] = rwd( preis,U,S1,N,Pbench,aktion,state_parameter,i,Z1 );
% Update U1
U1(i) = max(Rs + gamma*(Us'*P)');
end end end
Was du momentan hast, ist stattdessen ein Vektor linearer Indizes.
Grüße,
Harald
Damit funktioniert es offenbar.
Zum Verständnis: Was ist der Unterschied ob ich U1(i) adressiere oder U1(i(1),i(2),i(3)). Entspricht i nicht i(1),i(2),i(3)?
U1(i) ist dasselbe wie U1( [ i(1), i(2), i(3) ] ), aber ich habe ja die Klammern - ausnahmsweise bewusst - weggelassen.
U1(i) verwendet lineare Indizierung (ein Index, der spaltenweise gezählt wird), um (in deinem Fall) drei Elemente anzusprechen.
U1(i(1), i(2), i(3)) verwendet dagegen die beabsichtigte Zeilen-Spalten-Blatt - Indizierung.
An einem einfacheren Beispiel:
Code:
A = rand(3,3);
i1 = [5, 8];
A(i1)% liefert zwei Elemente mit linearer Zählweise
i2 = [2, 3];
A(i2(1), i2(2))% liefert das das Element in der 2. Zeile, 3. Spalte
A(i1(1), i1(2))% ergibt einen Fehler, weil nur 3 Zeilen/Spalten
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.