Verfasst am: 25.01.2016, 18:21
Titel: Berechnung von Entfernungen auf der Weltkugel
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
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
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.
_________________
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
%% Berechnung der Entfernungsmatrix von jedem Punkt zu jedem Punkt tic
Start_Lat=Y40_Entfernungsmatrix(3:end,1);
Start_Long=Y40_Entfernungsmatrix(3:end,2);
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
iffloor(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
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
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
_________________
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
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.