Verfasst am: 11.12.2012, 07:08
Titel: Vektorieller Ausdruck für Zuweisung von Ebene in 3D-Matrix?
Hallo,
ich würde gerne eine for-Schleife umgehen, mir fehlt aber die Kenntnis, wie ich das in diesem Fallen machen kann:
Kurzbeschreibung:
Ich habe eine heightmap (n x n) und will mir eine 3D Matrix generieren in der alle Einträge "unter" dem surface-plot dieser heightmap was zugewiesen bekommen. Anders: Ich würde gerne alle "Voxel" V(i,j,k) mit k< Z(i,j) mit einem Wert versehen. Wie mache ich das elegant?
Bei einer Matrix ist's ja kein Problem mit der Zuweisung:
Das muss doch schöner gehen als mit einer Hand voller for-Schleifen?! Wahlweise wäre mir auch eine ganz andere Funktion, die das leistet, völlig recht!
Beispiel: surf(Z) ergibt eine Pyramide. Alles darunter in V hätte ich gerne gefüllt. Es versteht sich, dass ich mit deutlich größeren und komplexeren Datensätzen arbeite, aber immer durch eine "heigtmap" quasi vollständig definierbar.
Ich habs jetzt nach bestem Wissen realisiert, es ist erwartungsgemäß langsam.
Hier im Beispiel hat Z die Dimensionen d = 1001 (^3). Wie man sieht ist das blöde rauskopieren der einen Ebene klar der Bottleneck.
Hm, hat denn keiner ne Idee?
ich merke überdies: ich brauch mehr RAM. Matrizen mit einer Milliarde Elementen sind halt schon groß.
edit:
Hier mal als Beispiel eine Pyramide mit Kantenlänge 101. Die Rechenzeit ist oben für eine mit Kantenlänge 1001, ergo 1000x mehr "Voxeln".
.
Ich brauche die Auflösung, damit die dünne Schicht, die man da hellblau sieht, auch noch halbwegs ordentlich aufgelöst werden kann.
hp = floor(max(max(Z))) + d1; % berechne Pyramidenhöhe, runde nach % unten ab und erhöhe um AR Coatings
V = ones(d,d,d); % pre allocate V
temp = zeros(d,d); % pre allocate temp
for i=1:hp; % von unten bis zur Spitze durchlaufen
temp = V(:,:,i); % horizontalen slice aus 3D Matrix rauskopieren
temp(temp < (Z-i+d1)) = n_SiN; % AR1 einfügen
temp(temp < (Z-i)) = n_Si; % AR2 einfügen
V(:,:,i)=temp; % slice wieder in 3D Matrix einfügen end
edit:
Hm, keines deiner Beispiele macht das was mein code oben macht. Oben wird in jeder "Schicht" von V, unten beginnend geprüft, welche Einträge in Z größer sind als bsp. i+1. Nur dort wird dann ein Wert gesetzt, nicht auf dieser ganzen Ebene, das ist leider falsch.
Bei deinem ersten Beispiel fehlt das jedenfalls komplett. Ich habe es anhand der Syntax aus dem zweiten Beispiel dann so umgeschrieben wie ich dachte, dass es laufen müsste, ist aber extrem langsam.
Habe noch einen dritten layer eingebaut, das ändert aber nix!
Das zweite Beispiel verstehe ich aber nicht. Erstens gehe ich davon aus, dass es ebenfalls V(:,:,i) ... mit 'i' heißen soll statt mit 1, dann auch in einer For-Schleife laufen soll, weil ja alle iZweitens läuft es in keiner Variante wie ich es probier. Bekomme immer nen dimensions-mismatch.
Ich habs jetzt mal so umgeschrieben, dass zumindest die eine dimension passt. V(:,:,i) ist aber ein dxd Array, und rechts vom '<' steht nur ein 1xd Vektor, daher raffe ich's nicht.
Code:
for i=1:d;
V(:,:,i < (Z - (1:d) + d1 + d2)) = n_SiN;
V(:,:,i < (Z - (1:d) + d1)) = n_SiO2;
V(:,:,i < (Z - (1:d))) = n_Si;
end;
So, besseres, kleineres Beispiel, damit ihr besser versteht worum's geht:
Ich denke, das ist jetzt wirklich selbsterklärend.
Ich will einen Ausdruck, der wörtlich:
A(:,:,i) soll an den Indizes wo A(:,:,i) > 1 ist den Eintrag 10 bekommen! Dafür muss es doch eine Schreibweise geben?
Führt das Beispiel aus, dann sollte alles klar sein:
display('ich will einen Ausdruck, wo in jedem A(:,:,i) Einträge größer 1 ersetzt werden!, nicht nur in A(:,:,1)!!');
display('so funktioniert es aber nicht!');
display('A(A(:,:,2) > 1)=10');
A(A(:,:,2) > 1)=10
display('ich will einen Ausdruck, wo dies auf A(:,:,2) angewandt wird, nicht auf A(:,:,1)! So funktioniert es aber nicht, ich verstehe einersetzs nicht warum (sollte wenn dann auf alle A(:,:,i) angewandt werden. Auf der anderen Seite will ich ja eben nur eine dedizierte Ebene ansprechen!');
A(A(:,:,2) > 1)=10
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.