Ich habe ein Raster von 5000 x 5000, und ich versuche, ein einfaches Modell der Krebsabteilung in MATLAB zu implementieren. Zunächst wählt es einen zufälligen Punkt (x, y) und macht diese Zelle zu einer Krebszelle. Bei der ersten Iteration teilt es sich - die Elternzelle bleibt an ihrem Platz, die Tochterzelle wird zufällig irgendeiner Nachbarzelle zugewiesen.
Einfach so weit.
Mein Problem ist folgendes: Bei aufeinanderfolgenden Iterationen wird eine Tochterzelle oft einer Zelle zugewiesen, die bereits eine Krebszelle hat. In diesem Fall möchte ich, dass die Tochterzelle ihren Platz einnimmt und die Zelle, die dort bereits vorhanden ist, zu einer benachbarten Zelle "anstößt". Wenn diese angrenzende Zelle leer ist, wird sie gefüllt und der Prozess stoppt. Wenn nicht, wird die Zelle, die sich bereits an dieser Stelle befindet, angestoßen und so weiter, bis die letzte Zelle einen leeren Platz findet und der Prozess stoppt.
Das sollte einfach sein, aber ich habe keine Ahnung, wie man es programmiert und welche Art von Schleifen zu verwenden.
Ich bin eher ein Naturwissenschaftler als ein Programmierer, also behandle mich bitte wie einen Dummkopf!
Hier ist eine Funktion, die ich zusammengehackt habe und die ungefähr Ihren Angaben entspricht.
Ich verlangsame, wie die Zahl der Krebszellen groß wird.
Grundsätzlich habe ich ein paar Variablen, die NxN-Matrix, die das Gitter von Zellstandorten darstellt (ich nenne dies ein plate
als Gitter ist der Name einer existierenden Matlab-Funktion)
Ein Vektor von Punkten, die ich schnell durchlaufen kann. Ich wähle einen Startpunkt und führe dann eine While-Schleife aus, bis das Gitter voll ist.
Bei jeder Schleifeniteration führe ich für jede Zelle folgendes aus:
Ich habe es nicht ausgiebig getestet, aber es scheint zu funktionieren.
%Vor%Hinweis: Anstatt Zellen zu verschieben, habe ich das so codiert, dass die Zellen dort bleiben, wo sie sich gerade befinden und die neue Zelle am Ende der Zeile / Spalte erstellt wird. Semantisch ist es anders, aber logisch hat es das gleiche Endergebnis, solange Sie sich nicht um die Generationen kümmern.
Inspiriert von einer anderen Frage habe ich Bildverarbeitungs-Techniken verwendet, um diese Simulation zu implementieren. Insbesondere können wir die morphologische Dilatation verwenden, um die Krebszellen zu verbreiten.
Die Idee ist, jedes Pixel mit einem strukturierenden Element zu erweitern, das wie folgt aussieht:
%Vor% wo das Zentrum fixiert ist, und das andere 1
wird zufällig an einer der anderen acht verbleibenden Positionen platziert. Dies würde das Pixel in dieser Richtung effektiv erweitern.
Die Art und Weise, wie die Dilatation ausgeführt wird, besteht darin, ein leeres Bild mit nur einem Pixelsatz zu erstellen und dann alle Ergebnisse mit einer einfachen ODER-Verknüpfung zu akkumulieren.
Um die Dinge zu beschleunigen, müssen wir nicht jedes Pixel betrachten, sondern nur diejenigen, die sich auf dem Umfang der aktuellen Blöcke befinden, die von den Clustern der Krebszellen gebildet werden. Die Pixel auf der Innenseite sind bereits von Krebszellen umgeben und hätten keine Wirkung, wenn sie erweitert wären.
Um noch weiter zu beschleunigen, führen wir die Erweiterung für alle Pixel aus, die in einem Aufruf in dieselbe Richtung verlängert werden. So führen wir bei jeder Iteration höchstens 8 Dilatationsoperationen durch.
Dies hat den Code relativ schnell gemacht (ich habe bis zu 1000x1000 Gitter getestet). Außerdem behält es über alle Iterationen das gleiche Timing bei (wird nicht langsamer, wenn das Gitter sich füllt).
Hier ist meine Implementierung:
%Vor%Ich habe auch eine Animation der Simulation in einem 500x500 Raster mit 10 zufälligen Krebszellen erstellt (Achtung: Das .gif Bild ist ungefähr 1 MB groß, daher kann es je nach Verbindung etwas dauern)
Tags und Links loops matlab recursion simulation while-loop