Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Definition von Variablen in Matlab (https://www.delphipraxis.net/79746-definition-von-variablen-matlab.html)

Nikolas 27. Okt 2006 11:18


Definition von Variablen in Matlab
 
Hallo

Ich höre zurzeit eine Einführung in Matlab und wollte mir damit als Einstieg eine kleine Simulation schreiben.
Die Aufgabe die ich bearbeiten will, stammt aus dem BWINF von vor zwei Jahren.

Kurz zur Aufgabe: Man hat ein 2D Array, dessen Felder mit Käse, Luft oder Wasser gefüllt sind. Dann giest man von links Wasser drauf (Gravitiation nach rechts denken). Von einem freien Feld kann das Wasser in die benachbarten 8 Felder fließen. Wenns rechts ankommt, ists schön, wenn nicht, ists auch interessant.

ich wollte das wieder rekursiv lösen und habe mir diese Funktion geschrieben:

Delphi-Quellcode:
function endegefunden = NachbarnFluten(x,y,Feld,ende)
% flutet die nachbarn, setzt sie auf Wasser, ruft sich rekursiv auf und
% gibt 1 zurück, falls das Ende gefunden wurde, sonst 0 
% Feld: 0:Frei; 1: Wasser, 2: Käse, 3: Ende

if ende==1  // Zeile 6
    return;
end

Feld(x,y)=1;
endegefunden=0;

%rechts
if Feld(x+1,y)==0 
    NachbarnFluten(x+1,y);
end

if Feld(x+1,y)==3 
  endegefunden=1
end //usw..
Die Spalte ganz rechts habe ich mit einer '3' markiert.

Das Feld wird hiermit erstellt (sollte fehlerfrei sein)
Delphi-Quellcode:
function Feld = Felderstellen(dimx,dimy,p)
% Feld hat dimx*dimy Größe, zusätzlich am Rand eine Schicht Käse,
% das rechte Ende (x=dimx+1) ist als Ende markiert
% Feld: 0:Frei; 1: Wasser, 2: Käse, 3: Ende

% Feld wird erstellt
for i = 2:(dimx+1) %Rechts die Schlussschicht
    for j= 2:(dimy+1) %Oben und unten Käse
        if rand < p
            Feld(j,i)=2;
        else
            Feld(j,i)=0;
        end
    end
end

%oberer/unterer Rand:
for i=2:(dimx+1)
    Feld(1,i)=2;
    Feld(dimy+2,i)=2;
end


% Auffangbecken+ Rand links:
for i=1:(dimy+2)
    Feld(i,dimx+2)=3;
    Feld(i,1)=2;
end
Das Ganze will ich dann hiermit starten:
Delphi-Quellcode:
function unused = Beginn(dimx,dimy,p)


ende=0;
Feld = Felderstellen(dimx,dimy,p);


for i=2:(dimy+1)
    if Feld(i,2)==0 
        ende=NachbarnFluten(i,2,Feld,ende); // Zeile 10
    end
end

Feld % Ergebniss wird angezeigt

if ende==1         
    disp('Ende')
else
    disp('kein Ende')
end
Wenn ich das letzt dann in MatLab mit 'Beginn(10,10,0.5)' aufrufe, bekomme ich die Fehlermeldung:

??? Input argument "ende" is undefined.

Error in ==> NachbarnFluten at 6
if ende==1

Error in ==> NachbarnFluten at 52
NachbarnFluten(x,y+1);

Error in ==> Beginn at 10
ende=NachbarnFluten(i,2,Feld,ende);


Hin und wieder läuft aber auch alles durch und es wird 'kein Ende' angezeigt. Das würde darauf hindeuten, dass es nur dann ein problem gibt, wenn ende auf 1 gesetzt wurde. Aber dann verstehe ich die Fehlermeldung nicht.

Kann mir da jemand helfen?

Niko 27. Okt 2006 12:23

Re: Definition von Variablen in Matlab
 
Hi,

bei folgendem rekursivem Aufruf in der Funktion NachbarnFluten, ist der Parameter ende undefiniert:

Code:
NachbarnFluten(x+1,y);

Nikolas 27. Okt 2006 12:46

Re: Definition von Variablen in Matlab
 
Warum denn? Ich übergebe die Variable doch bei jedem rekursiven Aufruf.

Muetze1 27. Okt 2006 13:20

Re: Definition von Variablen in Matlab
 
Zitat:

Zitat von Nikolas
Warum denn? Ich übergebe die Variable doch bei jedem rekursiven Aufruf.

Nein, tust du nicht. Im ersten Quellcode Block von dir in Zeile 15 übergibst du nur x und y und keine weiteren, somit auch nicht Ende. Daher auch die erste Fehlermeldung, welche genau dieses auch schon aussagt.

Nikolas 27. Okt 2006 14:27

Re: Definition von Variablen in Matlab
 
Oh natürlich. Jetzt sehe ich es auch. Vielen Dank. Da hat Pascal den Vorteil, dass es meckert, wenn man eine Funktion nicht so aufruft, wie man sie deklariert hat. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz