WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Verschachtelte Indizierung erstellen

 

ThWolf189
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 02.12.11
Wohnort: Dielsdorf
Version: ---
     Beitrag Verfasst am: 05.12.2011, 10:36     Titel: Verschachtelte Indizierung erstellen
  Antworten mit Zitat      
Hallo zusammen.

Nachdem ich einige Tage hier im Forum studiert und mir etliche Treads bezüglich Indizierung und Vektorisierung durchgelesen habe, wende ich mich heute das erste Mal direkt an Euch, da ich für meine Problemstellung keine Lösung gefunden habe.

Es geht darum, dass ich zwei quadratische Matrizen (n x n) habe. Diese Matrizen stellen in meinem Fall Oberflächentopographien eines Kreisquerschnittes dar. Beide Oberflächen sollten so gegeneinander verdreht werden, dass der Abstand zwischen ihnen minimal wird, sie also bestmöglich zusammenpassen. Es handelt sich hierbei um einen Ermüdungsversuch, bei dem ein Bewehrungsstab gebrochen ist und nun die Bruchflächen in Matlab zusammengefügt werden sollen, um den Luftspalt (Volumen, Distanzen) zwischen beiden Oberflächen zu bestimmen.

Beide Matrizen wurden bislang so aufbereitet, dass sie dieselbe Spalten- wie auch Zeilenanzahl aufweisen. In diesem konkreten Fall also jeweils 1536 x 1536 Elemente pro Matrix.

Eine der beiden Matrizen halte ich statisch und drehe die andere Matrix in 1°-Schritten und bestimme mir dann jeweils den Abstand jedes Punktes der statischen Matrix mit jedem Punkt der gedreht Matrix. Die Zielmatrix wollte ich mir gern als Cell-Array aufbauen
Code:
Distance{1:1536,1:1536}(1:1536,1:1536)
.
Mein bisherigen Ansatz mit einer vierfach verschachtelten for-Schleife ist bei der Grösse zeitintensiv.

Code:
[X,Y]      = meshgrid(-0.5:0.5,-0.5:0.5);

Surface1   = [1 -2; 2 0.5];           % Höhenwerte der ersten Oberflächen
Surface2   = rot90(Surface1,1) + 1;   % Rotation der ersten Fläche um 90° {Test}

[theta2,rho2,Z2] = cart2pol(X2,Y2,Mat2); % Umrechnung von Kartesischen- in Polarkoordinaten

rotW2 = W2 - 1; % Verdrehung um 1°
theta20    = (rotW2 .* pi()) ./ 180; % Umrechnung von Kartesischen- in Polarkoordinaten
[Xa,Ya,Za] = pol2cart(theta20,rho2,Z2); % gedrehte Matrix

for A = 1 : SXa(1) % Zeilen der statischen Matrix
    for B = 1 : SYa(1) % Spalten der statischen Matrix
        for C = 1 : SX1(1) % Zeilen der gedrehten Matrix
            for D = 1 : SY1(1) % Spalten der gedrehten Matrix
                Distance{A,B}(C,D) = sqrt((Xa(A,B) - X1(C,D))^2 + (Ya(A,B) - Y1(C,D))^2 + (Za(A,B) - Z1(C,D))^2);
            end
        end
    end
end


Besteht die Möglichkeit, diese Vierfach-Schleife komplett zu vektorisieren?

Eine lineare Vektorisierung habe ich versucht umzusetzen, was jedoch daran scheiterte, dass mein System mit 64bit und 128 GB RAM die vier Vektoren für A, B, C und D nicht erstellen konnte.

Code:
ElementsA = 1536;
ElementsB = 1536;
ElementsC = 1536;
ElementsD = 1536;

AInd = zeros((ElementsA * ElementsB) * (ElementsC * ElementsD),1);
BInd = zeros((ElementsA * ElementsB) * (ElementsC * ElementsD),1);
CInd = zeros((ElementsA * ElementsB) * (ElementsC * ElementsD),1);
DInd = zeros((ElementsA * ElementsB) * (ElementsC * ElementsD),1);

Count = 1;
for A = 1 : SXa(1)
    for B = 1 : SYa(1)
        for C = 1 : SX1(1)
            for D = 1 : SY1(1)
               
                if Count == 1
                    AInd = A;
                    BInd = B;
                    CInd = C;
                    DInd = D;
                else
                    AInd = [AInd; A];
                    BInd = [BInd; B];
                    CInd = [CInd; C];
                    DInd = [DInd; D];
                end
                Count = Count + 1;
               
            end
        end
    end
end
clear A B C D;


Code:
>> memory
Maximum possible array:             126910 MB (1.331e+011 bytes) *
Memory available for all arrays:    126910 MB (1.331e+011 bytes) *
Memory used by MATLAB:                 594 MB (6.229e+008 bytes)
Physical Memory (RAM):               65535 MB (6.872e+010 bytes)


Eine Allokierung der Ergebnis-Matrix ist in diesem Fall nicht möglich gewesen, da eben die Problematik mit dem Fehler "Out of Memory" besteht. Ich bin mir der Tatsache bewusst, dass ich zunächst die "Out of Memory"-Problematik lösen muss, bevor ich überhaupt die Vektorisierung angehen kann.


Vielen Dank bereits im Voraus.

Gruss
Thomas
Private Nachricht senden Benutzer-Profile anzeigen


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 05.12.2011, 12:28     Titel:
  Antworten mit Zitat      
Moin,

also ich bin mir nicht ganz sicher ob ich dein Problem richtig verstanden habe, aber gerade die verschachtelten for-Schleifen kannst du meines Erachtens sparen wenn du stattdessen schreibst:
Code:
Distance = sqrt((Xa - X1).^2 + (Ya - Y1).^2 + (Za - Z1).^2);

Damit solltest du das gleiche erreichen, nämlich elementweise Berechnung für jedes einzelne Element.

Gruß
Alex

PS: Ich habe nichts davon getestet - aber das war meine erste Idee, als ich den Code gesehen habe...
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
ThWolf189
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 02.12.11
Wohnort: Dielsdorf
Version: ---
     Beitrag Verfasst am: 05.12.2011, 13:17     Titel:
  Antworten mit Zitat      
Hallo steve

ich möchte eben nicht elementweise berechnen, sondern das erste Element der statischen Matrix mit allen der gedrehten Matrix, dann das zweite Element der statischen mit allen der gedrehten Matrix.

Ich werde versuchen eine Tabelle online zu stellen, die verdeutlich, wie die Indizes aussehen sollten.


Dennoch schon mal vielen Dank an Dich.
Gruss
Thomas

PS: Tabelle findet ihr im Anhang.

Indizierungstabelle.txt
 Beschreibung:
Tabelle für die Indizierung, wie ich sie für die Berechnung brauche am Beispiel zweier Matrizen mit 2 x 2 Elementen.

Download
 Dateiname:  Indizierungstabelle.txt
 Dateigröße:  180 Bytes
 Heruntergeladen:  349 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.12.2011, 21:29     Titel: Re: Verschachtelte Indizierung erstellen
  Antworten mit Zitat      
Hallo ThWolf189,

Dieser Vektor:
Code:
ElementsA = 1536;
ElementsB = 1536;
ElementsC = 1536;
ElementsD = 1536;
AInd = zeros((ElementsA * ElementsB) * (ElementsC * ElementsD),1);

benötigt 44.5 TB RAM. Da wirst Du mit 128 GB nicht viel ausrichten können.

Wenn Du das als {1538x1536} Cell mit jeweils einer [1536x1536] Matrix darstellst, wirst Du noch etwas mehr Speicher benötigen, aber wenigstens nicht mehr am Stück.

Sowiet ich es in Deinem Code sehe, benutzt Du allerdings keine "Pre-allocation" der Arrays. Das setigert den Speicherbedarf exponentiell, da die Arrays in jeder Iteration anwachsen. Zu diesem Stichwort findet man viele Beiträge im Forum.

Bist Du sicher, dass Du solche gigantischen Datenmengen gleichzeitig verfügbar haben möchtest?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ThWolf189
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 02.12.11
Wohnort: Dielsdorf
Version: ---
     Beitrag Verfasst am: 06.12.2011, 07:23     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für den Hinweis.
Die Umrechnung einer n x n Matrix in den dafür benötigten Speicherplatz habe ich mir vorher gar nicht angeschaut. Daher bin ich entsprechend erstaunt, wieviel Platz die Matrix letztendlich benötigt.

Gestern habe ich einen Weg eingeschlagen, bei dem ich mir diese Matrix versuche zu ersparen, in dem ich mir die minimale Distanz zwischen den beiden Matrizen direkt berechne und diese dann in ein Cell-Array rausschreibe.

Ob das gelingt, werde ich sehen.

Danke nochmals.
Gruss
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.