Verfasst am: 30.07.2010, 12:25
Titel: Problem Variablenübergabe bei rekursiver Funktion
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.
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.
Verfasst am: 30.07.2010, 12:40
Titel: Re: Problem Variablenübergabe bei rekursiver Funktion
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.
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
Zuletzt bearbeitet von yankemen am 30.07.2010, 13:08, insgesamt einmal bearbeitet
Apoklypse Nau
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 30.07.2010, 13:04
Titel:
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?
% 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
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.
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
Apoklypse Nau
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 30.07.2010, 13:35
Titel:
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:
Verfasst am: 30.07.2010, 15:01
Titel: Re: Problem Variablenübergabe bei rekursiver Funktion
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 )
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
% 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
_________________
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
Apoklypse Nau
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 30.07.2010, 15:23
Titel:
Hi,
Danke, das ist genau so, wie ich es ursprünglich haben wollte, nun sogar mit Erklärungen.
Echt super von dir!
Gruß
Apoklypse
Einstellungen und Berechtigungen
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.