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

Hilfe! Optimierung, for Schleife wegbringen!!!

 

RoyalFlush
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 27.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2010, 08:44     Titel: Hilfe! Optimierung, for Schleife wegbringen!!!
  Antworten mit Zitat      
Hallo!

Ich brauche bitte die Hilfe eines guten Programmierers.

Ich habe einige Liniensegmente und einen Referenzpunkt und berechne mir den minimalen Abstand zwischen den Liniensegmenten und meinem Punkt.

So weit so gut, das schaffe ich alles.

Hier mal der Code:
Code:

% Generate random lines L and one Reference Point P
L = rand(5,4); %[x1, y1, x2, y2]
P = rand(1,2); %[x, y]
%
% Calculate the squared lengths of all lines
Px = L(:,3) - L(:,1);
Py = L(:,4) - L(:,2);
Ls = Px.^2 + Py.^2;
%
% Calculate the minimal distances between the Reference point and the
% lines.
ua = ( (P(1)-L(:,1)).*Px + (P(2)-L(:,2)).*Py ) ./ Ls;
ua(ua>1) = 1;
ua(ua<0) = 0;
Cx = L(:,1) + ua.*Px;
Cy = L(:,2) + ua.*Py;
C = [Cx, Cy];
 


Cx und Cy sind nun die Koordinaten der Punkte auf den jeweiligen Linien, die den geringsten Abstand zu meinem Referenzpunkt haben.


So nun zum Problem: Ich habe mehrere Punkte und brauche von jedem einzelnen Punkt den minimalen Abstand zu allen Linien. Ich hab das mal ganz einfach gekoest und das ganze in eine Schleife gepackt und rechne mir jeden Punkt einzeln durch.
Allerdings brauche ich diese Funktion in einer Schleife sehr oft und hab sehr viele Linien und Punkte, also kommt es fuer mich auf jede Millisekunde an.

Kann mir bitte jemand zeigen, wie ich das ohne Schleife schaffe, oder besser gesagt die schnellst moegliche Loesung dafuer?

Vielen Dank!!!
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: 10.08.2010, 20:27     Titel:
  Antworten mit Zitat      
Hallo RoyalFlash,

es ist wichtig zu wissen, wieviele Linien und Punkte Du im richtigen Programm verwendest. Für 1000 Punkte und 500000 Linien würde ich eine andere Lösung erwarten als für 500000 Punkte und 1000 Linien.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 27.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2010, 01:03     Titel:
  Antworten mit Zitat      
Ich habe immer mehr Linien als Punkte, maximal gleich viel. Um eine ungefaehre Angabe zu machen, ca. 3000 Linien und 2000 Punkte.
Private Nachricht senden Benutzer-Profile anzeigen
 
santa claus
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 25.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2010, 07:38     Titel:
  Antworten mit Zitat      
Eventuell hilft dir mein Vorschlag alles über Matrizen-/Vektorschreibweise zu berechnen:

Code:

clear
clc

% Generate random lines L and one Reference Point P
L = rand(2000,4); %[x1, y1, x2, y2]
P = rand(2000,2); %[x, y] %

% Matrizen um eine Dimension erweitern
P1_2D=repmat(P(:,1),[1 length(L(:,1))]);
P2_2D=repmat(P(:,2),[1 length(L(:,1))]);
L1_2D=repmat(L(:,1),[1 length(L(:,1))]);
L2_2D=repmat(L(:,2),[1 length(L(:,1))]);
L3_2D=repmat(L(:,3),[1 length(L(:,1))]);
L4_2D=repmat(L(:,4),[1 length(L(:,1))]);
%
% Calculate the squared lengths of all lines
% Px = L(:,3) - L(:,1);
Px=L3_2D-L1_2D;
% Py = L(:,4) - L(:,2);
Py=L4_2D-L2_2D;
Ls = Px.^2 + Py.^2;
%
% Calculate the minimal distances between the Reference point and the
% lines.

% ua = ( (P(1)-L(:,1)).*Px + (P(2)-L(:,2)).*Py ) ./ Ls;
ua=((P1_2D'-L1_2D).*Px+(P2_2D'-L2_2D).*Py)./Ls;
ua(ua>1) = 1;
ua(ua<0) = 0;
% Cx = L(:,1) + ua.*Px;
Cx=L1_2D+ua.*Px;
% Cy = L(:,2) + ua.*Py;
Cy=L2_2D+ua.*Py;
% C = [Cx, Cy];
C=zeros(length(P(:,1)),length(P(:,1)),2);
C(:,:,1)=Cx;
C(:,:,2)=Cy;
 
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.