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

Problem Variablenübergabe bei rekursiver Funktion

 

Apoklypse Nau

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 12:25     Titel: Problem Variablenübergabe bei rekursiver Funktion
  Antworten mit Zitat      
Hallo,

ich habe ein Problem mit der Variablenübergabe in einer rekursiven Funktion. Und zwar soll eine Funktion mehrmals ausgeführt werden, als Eingangsvariable soll bei der ersten Durchführung eine vorgegebene Matrix geladen werden, bei jeder weiteren Durchführung jedoch das Ergebnis aus der vorherigen Iteration.


Mein Code dazu sieht wie folgt aus:
Code:

function  Funktion( U )

persistent n_ini

kMAX=10;

NXM=5;
NYM=5;
NZM=5;

n_ini=zeros(NXM,NYM,NZM,3);
n_ini(:,:,:,1)=1*ones(NXM,NYM,NZM);
n_ini(:,:,:,2)=1*ones(NXM,NYM,NZM);
n_ini(:,:,:,3)=0.01*ones(NXM,NYM,NZM);

n_neu=zeros(NXM,NYM,NZM,3);

    function [n]=relaxation(n)
       n_neu=U*randn.*n;
       n=sqrt(n_neu.^2);
         end

for k=1:1:kMAX
    if k==1
        n=n_ini;
        relaxation(n);
    else
        n=relaxation(k-1);
        relaxation(n);
    end
end

mid_x=n(:,:,3,1);
mid_y=n(:,:,3,2);

quiver(mid_x,mid_y);

end
 

Der erste Schritt scheint auch zu funktionieren, nur lädt er bei der zweiten Durchführung nicht die gewünschte Variable. Ich bekomme dann eine Fehlermeldung, dass die Dimension von n nicht passe.

Bin über jede Hilfe dankbar,

Gruß
Apoklypse


yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 30.07.2010, 12:40     Titel: Re: Problem Variablenübergabe bei rekursiver Funktion
  Antworten mit Zitat      
Moin Apoklypse,

Apoklypse Nau hat Folgendes geschrieben:
Code:

for k=1:1:kMAX
    if k==1
        n=n_ini;
        relaxation(n); % ist es Absicht, dass das n, das bei function [n] = relaxation(n) entsteht, nicht übernommen wird?
    else
        n=relaxation(k-1);
        relaxation(n); % Auch hier wird das zurück gegebene n nicht verarbeitet
    end
end
 

Der erste Schritt scheint auch zu funktionieren, nur lädt er bei der zweiten Durchführung nicht die gewünschte Variable. Ich bekomme dann eine Fehlermeldung, dass die Dimension von n nicht passe.

Ich verstehe nicht, warum relaxation rekusriv sein sollte? Per Definition ist sie es nicht. Sie wird lediglich aufgerufen und gibt ihr Ergebnis zurück. Auch sind die Aufrufe mit Rückgabe ins Nirwana etwas komisch.
Außerdem definierst Du eine Funktion in einer Funktion. Ich hätte erwartet, dass Matlab hier einen Fehler wirft. Das erklärt auch die komischen Einrückungen. Ich empfehle Dir, ganz oben einen Haltepunkt zu setzen und mit dem Debugger Schritt für Schritt durchgehen, dann siehst Du, was Deine Funktionen wann machen.

Das hier ist eine insich rekursive Funktion:
Code:
function [result] = recursion(result, n)

if n==0
   
    return;
else
     result = recursion(result,n-1)+n;
end
 


Hilft Dir das?

Gruß,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile

Zuletzt bearbeitet von yankemen am 30.07.2010, 13:08, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Apoklypse Nau

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 13:04     Titel:
  Antworten mit Zitat      
Hi,

danke für die schnelle Hilfe! Aber irgendwie bekomme ich deinen Ansatz nicht umgesetzt:
Zitat:

Code:

% ist es Absicht, dass das n, das bei function [n] = relaxation(n) entsteht, nicht übernommen wird?
 


Nein, eigentlich soll das Ergebnis der Funktion relaxation(n) für den nächsten Iterationsschritt übernommen werden!

Zitat:

Das hier ist eine insich rekursive Funktion:

Diese Funktion muss ich doch bei meiner for-Schleife einbauen, und nicht in der Funktion relaxation?!?

Wäre echt nett wenn du mir sagen könntest, wo genau in meinem Code ich diese Änderung vornehmen muss.

Gruß
Apoklypse
 
yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 30.07.2010, 13:15     Titel: Re: Problem Variablenübergabe bei rekursiver Funktion
  Antworten mit Zitat      
Moin Apoklypse,

wenn ich Dich richtig verstehe, dann suchst Du eigentlich ungefähr das hier?:
Code:
% Funktion wird mit U aufgerufen
function  Funktion( U )

persistent n_ini

kMAX=10;

NXM=5;
NYM=5;
NZM=5;

n_ini=zeros(NXM,NYM,NZM,3);
n_ini(:,:,:,1)=1*ones(NXM,NYM,NZM);
n_ini(:,:,:,2)=1*ones(NXM,NYM,NZM);
n_ini(:,:,:,3)=0.01*ones(NXM,NYM,NZM);

n_neu=zeros(NXM,NYM,NZM,3);

% Am Ende von Funktion läuft diese Schleife, die n neu berechnen soll    
% Beim ersten Aufruf soll n mit n_ini initialisiert werden
n = n_ini
for k=2:kMAX
    % bei jedem weiteren k soll n mittels relaxation neu berechnet werden.
    n=relaxation(k-1,U);
end

mid_x=n(:,:,3,1);
mid_y=n(:,:,3,2);

quiver(mid_x,mid_y);

end % hier endet function Funktion(U)

% relaxation kennt U nicht, deswegen muss das mit übergeben werden
function [n]=relaxation(n,U)
       n_neu=U*randn.*n;
       n=sqrt(n_neu.^2);
end
 

Tut das das, was es tun soll?
Also was soll eigentlich passieren?

Rekursive Funktionen sind zu vermeiden, da sie manchmal Speicherprobleme verursachen, weil sie zu tief absteigen. Eine fest definierte For-Schleife ist da sicherer, weil sie nicht alle Zwischenergebnisse speichert.
Weiterhin gilt: Jede Funktion extra definieren, ihr alles übergeben und von ihr alles übernehmen, was man braucht. Variablen existieren im Allgemeinen nur solange, wie die Funktion aufgerufen wird. Danach ist alles gelöscht, was nicht zurückgegeben wird.

Gruß,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Apoklypse Nau

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 13:35     Titel:
  Antworten mit Zitat      
Hi,

im Prinzip sollte dein Code genau das tun was ich möchte:

Ich erstelle erst eine Matrix n_ini, mit der der erste Durchlauf der Funktion relaxation durchgeführt werden soll. Das Ergebnis n dieses Durchlaufes soll dann wiederum an die Funktion relaxation übergeben werden, und es wird ein neues Ergebnis n berechnet. Nach Ablauf aller Iterationsschritte soll dann aus der Matrix n ein Bereich ausgewählt werden, der graphisch dargestellt wird.

Das Problem, welches ich bei der Umsetzung habe, ist dass die Matrix n nicht mehr dieselben Dimensionen hat wie die ursprüngliche Matrix n_ini. Matlab spuckt immer folgenden Fehler aus:
Zitat:

Code:
??? Index exceeds matrix dimensions.

Error in ==> Funktion at 27
mid_x=n(:,:,3,1);

 


Gruß
Apoklypse
 
yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 30.07.2010, 15:01     Titel: Re: Problem Variablenübergabe bei rekursiver Funktion
  Antworten mit Zitat      
Moin Apoklypse,
ich habe den Code mal weiter eingestampft - und selbst ablaufen lassen:
Du weist der Funktion relaxation den Wert k-1 für n zu. D.h., das n in relaxation bekommt beim Schleifendurchlauf den Wert k-1, beim ersten Mal also die 1, danach die 2. Somit sind alle Dimensionen futsch.
Was soll denn das k-1 bewirken? Dass die Funktion eigentlich von 10 bis 1 läuft? Dann würde sie nach Deinem Originalcode am Ende n=n_ini zuweisen und die Schleife wäre umsonst.

Code:
% Funktion wird mit U aufgerufen
function  Funktion( U )

persistent n_ini

kMAX=10;

NXM=5;
NYM=5;
NZM=5;

n_ini = ones(NXM,NYM,NZM,3); % wenn auch mal was anderes als Einsen kommen soll, dann brauchst Du Deinen Originalcode
n_ini(:,:,:,3)=0.01*n_ini(:,:,:,3);

% Diese Schleife, soll n neu berechnen
% Beim ersten Aufruf soll n mit n_ini initialisiert werden
n = n_ini;
for k=2:kMAX
    % bei jedem weiteren k soll n mittels relaxation neu berechnet werden.
    n = relaxation(n,U);
end

mid_x=n(:,:,3,1);
mid_y=n(:,:,3,2);

quiver(mid_x,mid_y);

end % hier endet function Funktion(U)

% relaxation kennt U nicht, deswegen muss das mit übergeben werden
function [n]=relaxation(n,U)
    n=U*randn.*n;
    n = sqrt(n.^2); % sichert, dass es positive Werte sind. Kann U negativ werden? wenn nicht, dann brauchst Du es auch nicht. Sonst schon.
end
 

Bitte mal Sinn und Zweck von k-1 klären, weil es in der Unterfunktion nicht wieder auftritt. Und bisher habe ich von U unabhängig immer das gleich Bild bekommen.
Gruß,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Apoklypse Nau

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 15:23     Titel:
  Antworten mit Zitat      
Hi,

Danke, das ist genau so, wie ich es ursprünglich haben wollte, nun sogar mit Erklärungen.
Echt super von dir!

Gruß
Apoklypse
 
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.