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

Berechnung von Entfernungen auf der Weltkugel

 

FrenktheCast
Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 23.11.07
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 25.01.2016, 18:21     Titel: Berechnung von Entfernungen auf der Weltkugel
  Antworten mit Zitat      
Hallo,

im Rahmen eines Projekt berechne ich die Luftline zwischen zwei Koordinaten im 3° Schritten. Dies wird in einer Entfernungsmatrix abgelegt. Der Code funktioniert so wie er soll - nur ist leider sehr Langsam. Trotz Speicherallokation dauert es .. sehr lange bis der Code durchläuft.

Obgleich ich durchaus das Konzept des Vektorisierens verstehe bin ich hier an meine Grenzen gestoßen. Kann mir jemand helfen?

Danke Euch!
Code:

Entfernungsmatrix=zeros(120*120+2,120*120+2); % --> Damit eine Breite von 3? (360/3 = 120)
% Ersten beiden Zeiten und Ersten beiden Spalten die Koordinate
% Die maximale Entfernung der Matrix-Punkte zueinander betr?gt 470 km --> Max_Entfernung=sqrt((333^2)+(333^2));
% Syntax:   Lat/ Long
%           -177/-177 - -177/-174 - -177/-171 - .... - 180/180
%   -177/-177
%   -177/-174
%   -177/-171
%   ....
%   180/180
Schrittweite=-177:3:180;
Entfernungsmatrix(1:2,1:2)=NaN;

%% Vorbelegen der Positionsangaben
for i=0:119
    Entfernungsmatrix(3+(i*120):122+(i*120),1)=i*3-177;         % Zeilen - Lat Werte  -177,-177,-177...180
   
    Entfernungsmatrix(3+(i*120):122+(i*120),2)=Schrittweite;    % Zeilen - Long Werte -177,-174,-171...180
       
    Entfernungsmatrix(1,3+(i*120):122+(i*120))=i*3-177;         % Spalten- Lat Werte  -177,-177,-177...180
   
    Entfernungsmatrix(2,3+(i*120):122+(i*120))=Schrittweite;    % Spalten- Long Werte -177,-174,-171...180
end
%% Naeherungsweise Bestimmung der Entfernung ueberprueft anhand: http://www.csgnetwork.com/gpsdistcalc.html
% a= -87;      % a: Breitenangabe Ort1
% b=  54;      % b: Laengenangabe Ort1
% c=  17;      % c: Breitenangabe Ort2
% d= -50;      % d: Laengenangabe Ort2
%
% arclen = distance(a,b,c,d); % ARCLEN (bzw. distance) gibt als Ergebnis die Bogenlaenge heraus!
%                             % Das ganze * 111.25 fuer Km oder * 60.07 fuer NautischeMeilen
% Entfernung_Nm=arclen*60.07;
% Entfernung_Km=arclen*111.25;

%% Berechnung der Entfernungsmatrix von jedem Punkt zu jedem Punkt
for Spalte=3:14402
    Lat_A=Entfernungsmatrix(1,Spalte) ; Long_A=Entfernungsmatrix(2,Spalte);
       
    for Zeile=3:14402
        Lat_B=Entfernungsmatrix(Zeile,1) ; Long_B=Entfernungsmatrix(Zeile,2);
        Entfernungsmatrix(Zeile,Spalte)=distance(Lat_A,Long_A,Lat_B,Long_B)*60.07;
    end
    disp(Spalte)
end
 
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.01.2016, 21:11     Titel:
  Antworten mit Zitat      
ok ein paar anmerkungen.
Code:

ausgaben ins commandwindow verlangsamen den code generell
das sollte also nicht gemacht werden.
des weiteren kann man bei distance auch arrays verwenden. guck dir mal
Code:
an
das könnte hilfreich sein.
außerdem kann man sich noch überlegen ob der abstand von a nach b nicht auch der selbe ist wie von b nach a so wie das aussiht berechnest du beide oder?
und kann man auf einer kugel nicht von beiden long und lat vertauschen und es kommt wieder das selbe raus? bin mir da grade nicht sicher. das würde die anzahl jedenfalls reduzieren.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
FrenktheCast
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 23.11.07
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 02.03.2016, 14:57     Titel:
  Antworten mit Zitat      
Problem gelösst. Habe die Distanceberechnung vektorisiert. Ein dank an Winkow für deine Hinweise.

Hier für alle die evtl. ein verlgeichbares Problem haben:
Code:

%% Festlegen der Genauigkeit

Aufloesung=3;
Gradzahl=360/Aufloesung;

Y40_Entfernungsmatrix=zeros(Gradzahl*Gradzahl+2,Gradzahl*Gradzahl+2); % --> Breite von z.B. 3 Grad (360/3 = 120)
% Ersten beiden Zeiten und Ersten beiden Spalten die Koordinate

% Die maximale Entfernung der Matrix-Punkte zueinander betraegt bei 3° 470 km --> Max_Entfernung=sqrt((333^2)+(333^2));
% Syntax:   Lat/ Long
%           -177/-177 - -177/-174 - -177/-171 - .... - 180/180
%   -177/-177
%   -177/-174
%   -177/-171
%   ....
%   180/180

Schrittweite=-180+Aufloesung:Aufloesung:180;                    % Erzeugt Vektor mit Gradangaben

Y40_Entfernungsmatrix(1:2,1:2)=NaN;                                 % Setzt den Kopf (1:2,1:2)

%% Vorbelegen der Positionsangaben
for i=0:Gradzahl-1
%   Entfernungsmatrix(3+(i*120):122+(i*120),1)=i*3-177;         % Zeilen - Lat Werte  -177,-177,-177...180
    Y40_Entfernungsmatrix(3+(i*Gradzahl):Gradzahl+2+(i*Gradzahl),1)=i*Aufloesung-(180-Aufloesung);
   
%   Entfernungsmatrix(3+(i*120):122+(i*120),2)=Schrittweite;    % Zeilen - Long Werte -177,-174,-171...180
    Y40_Entfernungsmatrix(3+(i*Gradzahl):Gradzahl+2+(i*Gradzahl),2)=Schrittweite;  
   
%   Entfernungsmatrix(1,3+(i*120):122+(i*120))=i*3-177;         % Spalten- Lat Werte  -177,-177,-177...180
    Y40_Entfernungsmatrix(1,3+(i*Gradzahl):Gradzahl+2+(i*Gradzahl))=i*Aufloesung-(180-Aufloesung);
   
%   Entfernungsmatrix(2,3+(i*120):122+(i*120))=Schrittweite;    % Spalten- Long Werte -177,-174,-171...180
    Y40_Entfernungsmatrix(2,3+(i*Gradzahl):Gradzahl+2+(i*Gradzahl))=Schrittweite;
end

clear i

%% Berechnung der Entfernungsmatrix von jedem Punkt zu jedem Punkt
tic
Start_Lat=Y40_Entfernungsmatrix(3:end,1);
Start_Long=Y40_Entfernungsmatrix(3:end,2);

for Spalte=3:Gradzahl^2+2
   
    Ziel_Lat=Y40_Entfernungsmatrix(1,Spalte); Ziel_Long=Y40_Entfernungsmatrix(2,Spalte);  
   
    Y40_Entfernungsmatrix(3:end,Spalte)=distance(Start_Lat(1:end),Start_Long(1:end),Ziel_Lat,Ziel_Long)*60.07;
    %*60,07 für umbrechnung in Nm

    if floor(Spalte/500) == Spalte/500
        IST_Berechnet=num2str(Spalte*Gradzahl^2);  
        SOLL_Berechnet=num2str(Gradzahl^2*Gradzahl^2);  
        Anzeige=sprintf('%s von %s Entfernungen auf der Erdkugel berechnet',IST_Berechnet,SOLL_Berechnet);
        disp(Anzeige)
    end
     
end

toc % Die Gesamtberechnung der 200 Millionen Entfernungen auf der Kugel (Erde) benötigt <20Sekunden
clear Anzeige Aufloesung Gradzahl IST_Berechnet SOLL_Berechnet Spalte Schrittweite Ziel_Lat Ziel_Long Start_Lat Start_Long
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.03.2016, 16:50     Titel:
  Antworten mit Zitat      
Code:
Aufloesung=3;
Gradzahl=360/Aufloesung;
Y40_Entfernungsmatrix=(zeros(Gradzahl*Gradzahl+2,Gradzahl*Gradzahl+2));
Schrittweite=-180+Aufloesung:Aufloesung:180;
[LAT,LONG]=meshgrid(Schrittweite,Schrittweite);
LAT1=(repmat(LAT(:),1,size(LAT(:),1)));
LONG1=(repmat(LONG,size(LONG,1),size(LONG,2)));
Y40_Entfernungsmatrix(3:end,3:end)=(distance(LAT1,LONG1,LAT1',LONG1'))*60.07;

für eine grobere auflösung ist das ein wenig schneller. es ist aber nicht sehr speicher optimiert. bei großen matritzen könnte die abarbeitung in der schleife trotzdem besser sein. bei meinem laptop ist es zb für auflösung von 6 fast doppelt so schnell. eine auflösung von 3 kann er aber aus speicher mangel so nicht bewältigen.
grüße winkow
nachtrag: grade auf nem rechner mit mehr ram getestet. der unterschied sind nur 2 sekunden bei mir
_________________

richtig Fragen
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.