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

Wert wird nicht richtig in Array geschrieben

 

LordExcalibur
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 08.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2014, 16:02     Titel: Wert wird nicht richtig in Array geschrieben
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.09.2014, 16:27     Titel:
  Antworten mit Zitat      
Hallo,

wenn matchU nicht in jeder Iteration andere Werte liefert, dann ist bei diesem Algorithmus davon auszugehen, dass Teile von U1 überschrieben werden.

Wie ist U1 denn vor den Schleifen deklariert?

Kannst du konkrete Beispiele für i nennen und wohin geschrieben wird?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 08.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2014, 21:56     Titel:
  Antworten mit Zitat      
U1 ist deklariert als 21x11x16 Array und wird mit
U1 = zeros(21,11,16) initialisiert.

Ich habe mal für ein paar Iterationen die Variablen hier notiert:

Iteration 1:
i = [1 1 1]
max(Rs + gamma*(Us'*P)') = 18.75
U1(1,1,1) = 18,75

Iteration 2:
i = [1 1 2]
max(Rs + gamma*(Us'*P)') = 15
U1(1,1,1) = 15
U1(1,1,2) = 15

Iteration 3:
i = [1 1 3]
max(Rs + gamma*(Us'*P)') = 11.25
U1(1,1,1) = 11,25
U1(1,1,2) = 15
U1(1,1,3) = 11.25

Iteration 4:
i = [1 1 4]
max(Rs + gamma*(Us'*P)') = 7.5
U1(1,1,1) = 7.5
U1(1,1,2) = 15
U1(1,1,3) = 11.25
U1(1,1,4) = 7.5


....
Iteration X
i = [1 2 1]
max(Rs + gamma*(Us'*P)') = 18.75
...
U1(1,2,1) = 0

Iteration X+1
i = [1 2 2]
max(Rs + gamma*(Us'*P)') = 15
...
U1(1,2,1) = 0
U1(1,2,2) = 0


Bei allen weiteren Iteration wird immer nur 0 in U1 geschrieben bzw. gar kein Wert geschrieben, da das Array mit 0 initialisiert wurde.
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2014, 22:32     Titel:
  Antworten mit Zitat      
LordExcalibur hat Folgendes geschrieben:
Bei allen weiteren Iteration wird immer nur 0 in U1 geschrieben bzw. gar kein Wert geschrieben, da das Array mit 0 initialisiert wurde.


Lass doch die Initialisierung erst mal weg, dann siehst Du deutlicher, ob null geschrieben wird oder einfach gar nichts passiert...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.09.2014, 22:51     Titel:
  Antworten mit Zitat      
Hallo,

du meinst
Code:
U1(i(1), i(2), i(3)) = ...

Was du momentan hast, ist stattdessen ein Vektor linearer Indizes.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 08.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2014, 08:27     Titel:
  Antworten mit Zitat      
Epfi hat Folgendes geschrieben:
LordExcalibur hat Folgendes geschrieben:
Bei allen weiteren Iteration wird immer nur 0 in U1 geschrieben bzw. gar kein Wert geschrieben, da das Array mit 0 initialisiert wurde.


Lass doch die Initialisierung erst mal weg, dann siehst Du deutlicher, ob null geschrieben wird oder einfach gar nichts passiert...


In diesem Fall wird nichts mehr geschrieben. D.h. die erste Iteration der innersten Schleife läuft durch, und dann passiert nichts mehr in U1.
Private Nachricht senden Benutzer-Profile anzeigen
 
LordExcalibur
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 08.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2014, 08:31     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

du meinst
Code:
U1(i(1), i(2), i(3)) = ...

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)?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.09.2014, 09:11     Titel:
  Antworten mit Zitat      
Hallo,

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


Grüße,
Harald
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.