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

Schnelle Berechnung des Flächeninhaltes einer Punktewolke

 

Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 31.03.2013, 17:07     Titel:
  Antworten mit Zitat      
kann meinen obigen Code nicht mehr ändern, hab aber festgestellt, dass ich schonmal ein ähnliches Probem hatte und griddata zur Umforumung zu X, Y, Z hilfreich war...
http://www.gomatlab.de/matrix-extrapolieren-t8338.html
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen


dotwinX
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 06.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2013, 16:33     Titel:
  Antworten mit Zitat      
Moin,

also unter "jede Punktewolke" meine ich genau das, was unter untitled.jpg gezeigt wird. Und die eigentliche Berechnung sollte möglichst ohne Schleife gehen. Den Schritt davor, von Plot3->x,y,z ein Mesh->X,Y,Z zu machen habe ich leider nicht ohne Schleife geschafft. Nur verstehe ich nicht was du mit dem Radius-Ansatz genau meinst...

Mit meiner bisherigen Lösung kann ich im ersten Schritt ein Mesh erstellen, das klappt (Siehe untitled2.jpg: 1. und 2. Plot jeweils die Pkt-Wolke, 3. Plot ist das Mesh, voll besetzt auch mit Nullen, 4. Plot ohne die Nullen). Aber wo wandle ich die Meshgrid zu Zeilenvektoren um?

Wie ich e und f berechne schreibe ich gerne hier, aber dafür muss ich erst einen Kollegen um Erlaubnis bitten.

Bzgl. griddata:
Funktioniert ganz gut, ist aber tatzächlich langsamer:
Code:

tic
Ztest=griddata(Pktwolke(:,1),Pktwolke(:,2),Pktwolke(:,3),X,Y)
toc

Elapsed time is 0.255191 seconds.


Code:

tic
%Schritt 2: Fülle die Z-Matrix durch zeilen/spaltenweisen Vergleich
Z=zeros(size(X)); %Pre-Allo

%http://www.gomatlab.de/viewtopic,p,110463.html#110463
aX = X(1, :); %X(1,:) reicht, weil die Spalteneinträge alle gleich sind;
aY = Y(:, 1); %Y(:,1) reicht, weil die Zeileneinträge alle gleich sind;

for k=1:1:length(Pktwolke(:,3))
   
    %Pktwolke(k,1) = aktueller Punkt x;
    %Pktwolke(k,2) = aktueller Punkt y;
       
    index_x = aX == Pktwolke(k,1);
    index_y = aY == Pktwolke(k,2);
       
    Z(index_x, index_y) = Pktwolke(k,3);
   
end

%Schneide die zu großgeratene Matrix Z (Ist durch die Schleife oben immer eine Square-Matrix, dies ist aber nicht nötig)
Z(~any(Z,2),:)=[];
Z(:,~any(Z))=[]; Z=Z';
toc

Elapsed time is 0.130635 seconds.

Aber ist eine deutlich kürzere Alternative wenns um die Codelänge geht Smile

untitled2.jpg
 Beschreibung:

Download
 Dateiname:  untitled2.jpg
 Dateigröße:  180.27 KB
 Heruntergeladen:  361 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 01.04.2013, 16:49     Titel:
  Antworten mit Zitat      
oh, na dann ist dein Ansatz allemal vorzuziehen und die Arbeit Wert gewesen!
Rein aus Neugier: Z ist aber mit Ztest identisch, oder?

Die Idee e und f zu nehmen ist besser/schneller wie mein Ansatz. Ich weiss auch ungefähr wie man rankommt. Also wenn du den nicht so recht zeigen magst/darfst, macht mir das nix Wink

Tipp1: Wenn die Berechnung immer noch zu langsam ist, dünne einfach in x oder y (das was größer digitalisiert ist) aus.
Tipp2: Sollte es nur um den Vergleich der Oberflächen gehen oder der extakte Wert irgendwann am Ende nötig sein, verzichte auf das sqrt.
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
dotwinX
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 06.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2013, 10:19     Titel:
  Antworten mit Zitat      
Moin Andy,

jup, Ztest ist gleich Z

hab den Kollegen gefragt und her hat nichts dagegen. Also hier der vollständige Code für die Flächenberechnung mittels Viereckformel:

Code:

[x, m, n] = unique(Pktwolke(:,1));
[X,Y] = meshgrid(x,y);

% %Test als Mesh: http://www.gomatlab.de/matrix-extrapolieren-t8338.html
% tic
% Ztest=griddata(Pktwolke(:,1),Pktwolke(:,2),Pktwolke(:,3),X,Y);
% toc

% Schritt 2: Fülle die Z-Matrix durch zeilen/spaltenweisen Vergleich
Z=zeros(size(X)); %Pre-Allo

% http://www.gomatlab.de/viewtopic,p,110463.html#110463
aX = X(1, :); %X(1,:) reicht, weil die Spalteneinträge alle gleich sind;
aY = Y(:, 1); %Y(:,1) reicht, weil die Zeileneinträge alle gleich sind;

for k=1:1:length(Pktwolke(:,3))
   
    % Pktwolke(k,1) = aktueller Punkt x;
    % Pktwolke(k,2) = aktueller Punkt y;
       
    index_x_u = aX == Pktwolke(k,1);
    index_y_u = aY == Pktwolke(k,2);

    Z(index_x_u, index_y_u) = Pktwolke(k,3);
   
end

% Schneide die zu großgeratene Matrix Z (Ist durch die Schleife oben immer
% eine Square-Matrix, dies ist aber nicht nötig)
Z(~any(Z,2),:)=[];
Z(:,~any(Z))=[];
Z=Z';

% Aufstellen der Indicies, verkürzt die jeweilige Matrix
indx=1:length(Z(:,1))-1;
indy=1:length(Z(1,:))-1;
   
% Berechnung der Diagonalenlängen |e| und |f|
e = sqrt(...
        (X(indx,indy)  -  X(indx+1,indy+1)).^2+...
        (Y(indx,indy)  -  Y(indx+1,indy+1)).^2+...
        (Z(indx,indy)  -  Z(indx+1,indy+1)).^2);

f = sqrt(...
        (X(indx+1,indy)  -  X(indx,indy+1)).^2+...
        (Y(indx+1,indy)  -  Y(indx,indy+1)).^2+...
        (Z(indx+1,indy)  -  Z(indx,indy+1)).^2);

% Skalarprodukt der Diagonallängen, Komponentenweises e*f
    SkProd = (X(indx,indy)  -  X(indx+1,indy+1)).*...
        (X(indx+1,indy)     -  X(indx,indy+1))+...
        (Y(indx,indy)       -  Y(indx+1,indy+1)).*...
        (Y(indx+1,indy)     -  Y(indx,indy+1))+...
        (Z(indx,indy)       -  Z(indx+1,indy+1)).*...
        (Z(indx+1,indy)     -  Z(indx,indy+1));

% 1) Berechnung des näherungsweisen Flächeninhalt einzelner Zellen
% A = 1/2 * [ |e|^2+|f|^2 - (e * f)^2 ]
CutCellArea = 0.5*sqrt(e.^2.*f.^2-(SkProd).^2);

% Bisher werden die 0er-Einträge als Fläche mitberechnet! Dies ist
% nicht korrekt. Aus diesem Grund findet ein Vergleich mit Z statt und alle
% Werte aus CutCellArea werden entfernt, wenn Z = 0 ist.

Zzero1=~Z(1:end-1,1:end-1)==0;  % Obere linke Ecke
Zzero2=~Z(2:end,2:end)==0;      % Untere rechte Ecke
Zzero=or(Zzero1,Zzero2);
CutCellArea_ohne_null=CutCellArea_all.*Zzero;

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.