Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Ingenierumathematik mit MATLAB

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Alle Stellen einer Matrix innerhalb gegebener Simplizes

 

Gast_Sandra

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2020, 08:46     Titel: Alle Stellen einer Matrix innerhalb gegebener Simplizes
  Antworten mit Zitat      
Was ich mache möchte:
Ich habe eine 4-dimensionale Matrix M, eine Menge von Punkten P={[j k l m]}, die Stellen dieser Matrix angeben, und eine Menge von disjunkten Simplizes S={[P1 P2 P3 P4 P5]} über diesen Punkten (gefunden durch eine Delaugney-Triangulierung). Ich möchte jetzt alle Stellen der Matrix finden, die innerhalb eines dieser Simplizes liegen, in welchem genau, ist egal. Ich mache das aktuell wie folgt. Dabei hat N am Ende an allen Stellen eine 1, für die die zugehörige Stelle in M die geforderte Bedingung erfüllt.

Code:

N = ones(size(M));

for j=1:size(M,1)
    for k=1:size(M,2)
        for l=1:size(M,3)
            for m=1:size(M,4)
                if N(j,k,l,m) == 1
                    if (~isnan(tsearchn(P,S,[j k l m])))
                        N(j,k,l,m) = 0;
                    end
                end
            end
        end
    end
end
 


Das dauert aber ewig. Ich hoffe, man könnte das vlt. noch wesentlich schneller machen. Gibt es zum Beispiel irgendeine Möglichkeit, die Vereinigung aller Simplizes darzustellen? Oder so?

Danke schonmal.


Harald
Forum-Meister

Forum-Meister


Beiträge: 22.178
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.10.2020, 09:00     Titel:
  Antworten mit Zitat      
Hallo,

aus der Doku von tsearchn:
Zitat:
XI is a p-by-n matrix, representing p points in N-dimensional space.

Das sollte also vektorisierbar sein.

Für weitere Unterstützung bitte Beispiele für P und S angeben, damit man damit experimentieren kann.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast_Sandra

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2020, 10:09     Titel:
  Antworten mit Zitat      
Danke schonmal, aber ich weiß leider nicht, wie mir das weiterhilft.
Ich habe mal ein kleines Beispiel erstellt:

Code:

M = ones(10,10,10,10);    %einfache Beispielmatrix

P=[1 1 1 1;2 2 2 2;3 3 3 2; 1 2 4 8; 5 1 2 4; 8 7 7 7; 8 3 1 4; 9 1 4 7; 9 7 2 9];
   
S = delaunayn(P);     %ergibt hier 17 Simplizes

N = ones(10,10,10,10);

for j=1:size(M,1)
    for k=1:size(M,2)
        for l=1:size(M,3)
            for m=1:size(M,4)
                if N(j,k,l,m) == 1
                    if (~isnan(tsearchn(P,S,[j k l m])))
                        N(j,k,l,m) = 0;
                    end
                end
            end
        end
    end
end
 


Ich korrigiere mich nochmal: N hat am Ende für alle Indizes den Wert 0, die innerhalb eines der gegebenen Simplizes liegen, und den Wert 1 außerhalb.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 22.178
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.10.2020, 10:52     Titel:
  Antworten mit Zitat      
Hallo,

Vektorisierung ist schneller.

Code:
for j=1:size(M,1)
    for k=1:size(M,2)
        for l=1:size(M,3)
            %for m=1:size(M,4)
            %    if N2(j,k,l,m) == 1
                    %if ()
                        N2(j,k,l,:) = isnan(tsearchn(P,S,...
                            [repelem(j,size(M,4),1),...
                             repelem(k,size(M,4),1),...
                             repelem(l,size(M,4),1), (1:size(M,4))']));
                    %end
            %    end
            %end
        end
    end
end


Interessanterweise kommt an genau einer Stelle ein anderes Ergebnis heraus. Warum, sehe ich auf Anhieb nicht. Wenn du das Problem lösen kannst, kannst du aber auch versuchen, den Ansatz auszubauen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast_Sandra

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2020, 11:31     Titel:
  Antworten mit Zitat      
Vielen Dank!

Bei mir kommen in dem einfachen Beispiel bei beiden Varianten dieselben Ergebnisse raus Question

Ich habe deine Variante mal mit meinem komplexeren Problem ausprobiert. Das hat die Rechenzeit schonmal von 3 Stunden auf 7 Minuten gedrückt Very Happy

Mit "den Ansatz ausbauen" meinst du, dass ich auch die anderen Koordinaten vektorisieren könnte? Das probier ich mal.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 22.178
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.10.2020, 11:54     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich habe deine Variante mal mit meinem komplexeren Problem ausprobiert. Das hat die Rechenzeit schonmal von 3 Stunden auf 7 Minuten gedrückt Very Happy

Das ist doch was. :) Die Ergebnisse stimmen auch überein?

Zitat:
Mit "den Ansatz ausbauen" meinst du, dass ich auch die anderen Koordinaten vektorisieren könnte? Das probier ich mal.

Genau. Da wird man aber ein wenig basteln müssen, dass man mit repelem / repmat oder anderen Funktionen die benötigte Matrix hinbekommt.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast_Sandra

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2020, 19:21     Titel:
  Antworten mit Zitat      
Habe es hinbekommen. So sieht es jetzt aus:

Code:
                         
  N = reshape(isnan(tsearchn(P,S,...
    [repelem((1:size(M,1))',size(M,2)*size(M,3)*size(M,4),1),...
        repmat((repelem((1:size(M,2))',size(M,3)*size(M,4),1)),size(M,1),1),...
        repmat((repmat((repelem((1:size(M,3))',size(M,4),1)),size(M,2),1)),size(M,1),1),...
        repmat((1:size(M,4))',size(M,1)*size(M,2)*size(M,3),1)])),size(M));
 


Jetzt bin ich bei unter 3 Minuten. Dann kann ich mich ja jetzt mal an noch etwas größere Matrizen wagen.
Und ja, die Ergebnisse stimmen überein Smile

Danke nochmal.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 22.178
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.10.2020, 21:03     Titel:
  Antworten mit Zitat      
Hallo,

ich habe hier noch eine Funktion gefunden, die effizienter sein kann:
https://www.mathworks.com/matlabcentral/fileexchange/10226-inhull

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast_Sandra

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2020, 12:00     Titel:
  Antworten mit Zitat      
Ich habe mir die inhull-Funktion jetzt mal angesehen. Das Problem ist, dass die Funktion eine konvexe Hülle meiner Simplizes bräuchte. Ich finde aber keine Methode, wie ich die berechnen könnte.
Hat jemand eine Idee dafür?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 22.178
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.10.2020, 12:14     Titel:
  Antworten mit Zitat      
Hallo,

bist du sicher, dass du das brauchst? Im Beitrag steht:
Zitat:
If not supplied, it also computes the convex hull too.


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast_Sandra

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2020, 14:37     Titel:
  Antworten mit Zitat      
Hab ich zumindest so verstanden, ja...

Der Code von inhull nutzt

Code:

tess = convhulln(xy);
 


um die konvexe Hülle der Punktemenge xy zu bestimmen. Ich habe ja aber keine Punktmenge, sondern eine Menge von Simplizes. Die konvexe Hülle davon ist ja viel kleiner, als die konvexe Hülle aller Eckpunkte.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 22.178
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.10.2020, 16:39     Titel:
  Antworten mit Zitat      
Hallo,

gute Frage. Die andere Frage ist, ob die inhull-Funktion dann überhaupt ein direkter Ersatz ist.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.