Verfasst am: 09.10.2013, 12:32
Titel: Zu bereich von Matirx 1 Addieren
Hallo Leute,
Sollte ich das hier jetzt zum zweiten mal schreiben bitte löschen da ich meinen gerade abgeschickten Eintrag nicht mehr finde.
Ich spar mir mal das ich bin Anfänger und Co.
Folgendes Problem:
Ich möchte eine Art Spiel des Lebens (http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens) berechnen und als 3D Plot ausgeben. Klappt auch alles so weit ganz gut. Es dauert nur zulange zu berechnen ab 50x50x50 wird es echt langsam und ich denke das 125.000 Zellen nicht zu viel sein sollte.
Ich möchte Berechnen wie viele benachbarte lebende Zellen jede Zelle hat und dann größer und kleiner eines Wertes die Zellen leben lassen oder sterben lassen, Verinfacht:
Anfang:
000000
001000
000100
000000
Ergebnis:
011100
012210
012210
001110
Und dann halt alles z.b. größer 2 und kleiner 5 = 1 der Rest = 0,
Ach ja wenn noch einer eine Idee hat wie ich eine Matrix x,y,z, zufällig mit x% 1 füllen kann bitte gerne. Wie gesagt was ich hab geht dauert nur zulange.
Verfasst am: 09.10.2013, 13:38
Titel: Re: Zu bereich von Matirx 1 Addieren
Hallo Amper_Gast,
Ich finde die Namen "leben", "leben2" und "leben3" unübersichtlich.
Die als WHILE formulierten FOR-Schleifen sind ebenfalls weniger klar.
Es fehlt noch jegliche Dokumentation. Es ist für einen Leser im forum zunächst mal schwer zu erraten, ob der Input "leben" eine DOUBLE-Matrix oder ein UINT8-3D-Array ist. Bei der Rechengeschwindigkeit kommt es aber darauf an.
Wann immer man code optimieren möchte, sollte man zunächst den Flaschenhals finden. Es wäre ja sinnlos eine Zeile um den Faktor 1000 zu beschleunigen, die nur 1% der Rechenzeit benötigt. Der Profiler dient genau zu diesem zweck (siehe "doc profile").
Ich rate mal, dass "leben3=0; leben3(xy(1),xy(2))=0;" sehr viel Zeit vertrödelt, denn es wird in jeder Iteration eine Matrix im Speicher reserviert und wieder freigegeben. Viel effizienter ist es, die Matrix nur mit Nullen zu füllen: "leben3(:) = 0".
for x = 2:nx-1 for y = 2:ny-1 for z = 2:nz -1 if leben(x,y,z) == 1
leben3(x-1:x+1,y) = 1;
leben3(x-1:x+1,y+1)=1;
leben3(x-1:x+1,y-1)=1;
leben2(:,:,z-1*z+1) = bsxfun(@plus, leben3 + leben2(:,:,z-1:z+1));
leben3(:) = 0;
end end end end
"Matrix x,y,z" ist nicht klar: Matrizen haben immer nur 2 Dimensionen.
Gruß, Jan
Amper_Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 09.10.2013, 14:44
Titel:
Hallo Jan S,
danke erst mal für die Antwort.
Na ja was die Namensgebung angeht bin ich nicht besonder erfinderrisch deswegen hab ich die einfach durch nummerriert.
der Input ist noch eine Double-3D-Array sollte aber noch auf UINT8-3D geändert werden. Hab ich auch vorhin schon gelesen, dass das helfen soll hat aber noch nicht geklap ist aber ein anders Thema.
WHILE schleifen hab ich genommen da ich die kenne und hinbekommen habe.
Ich probier jetzt mit den Code von dir rum. Und meld mich später noch mal.
Danke
Amper
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.