2014-09-15 3 views
0

Я вычисляю расстояние и скорость между координатами GPS (lat, long, height), и, похоже, он работает хорошо, когда я использовал одиночные значения. Однако у меня есть матрица из 79 координат GPS (матрица 3x79), и я хочу найти расстояние и скорость между каждыми двумя последовательными точками. Когда я пытаюсь использовать цикл for, вывод, который я получаю, это все нули, кроме первого и последнего значения (которые очень высоки).Для петли не работает по желанию

Я, вероятно, делать что-то глупо, но я могу определить его ... любые предложения приветствуются :)

for k=1:77 
    R=6378.1e3; 

    latDistance = copter_llh(1,k+1) - copter_llh(1,k); 
    lonDistance = copter_llh(2,k+1) - copter_llh(2,k); 

    a = sin(latDistance/2) * sin(latDistance/2) + cos(copter_llh(1,k))... 
     *cos(copter_llh(1,k+1)) * sin(lonDistance/2) * sin(lonDistance/2); 
    c = 2 *atan2(sqrt(a), sqrt(1 - a)); 

    distance = R * c * 1000; % convert to meters 

    height = copter_llh(3,k+1) - copter_llh(3,k); 
    distance = sqrt((distance^ 2) + (height^2)); 
    velocity = distance/0.1*60; 
    % stepsize =0.1min ___speed in m/s 
    distance(:,k)=(distance); 
    velocity(:,k)=(velocity); 
end %----- 
+0

Это должно добавить компонент высоты точки к широте/широкому расстоянию. Я не стал матрицей из этого. – Buzz92

+0

Думаю, я знаю, почему это происходит. Проверьте мой ответ. – rayryeng

+0

Формула работает, когда я указываю точки, которые я хочу напрямую, а не когда я использую цикл for – Buzz92

ответ

2

Похоже, вы повторно ваш distance переменную непреднамеренного способом, а также ваш velocity переменная в конце вашего цикла for. Вы мутируете переменную distance, а затем пытаетесь изменить ее как матрицу. Вам нужно будет изменить эту переменную, а затем вызвать, где вы хотите сохранить свою матрицу, как что-то еще. Кроме того, distance и velocity выглядят как одиночные массивы, и поэтому : доступ к первому измерению является излишним. Таким образом, попробуйте сделать это вместо:

distance = zeros(1,77); %// NEW - Preallocate distance array 
velocity = zeros(1,77); %// NEW - Preallocate velocity array 
R=6378.1e3; %// NEW - Leave outside for loop. Constant at each iteration 
for k=1:77 

    latDistance = copter_llh(1,k+1) - copter_llh(1,k); 
    lonDistance = copter_llh(2,k+1) - copter_llh(2,k); 

    a = sin(latDistance/2) * sin(latDistance/2) + cos(copter_llh(1,k))... 
     *cos(copter_llh(1,k+1)) * sin(lonDistance/2) * sin(lonDistance/2); 
    c = 2 *atan2(sqrt(a), sqrt(1 - a)); 

    dist = R * c * 1000; %// convert to meters - NEW - change variable 

    height = copter_llh(3,k+1) - copter_llh(3,k); 
    %// stepsize =0.1min ___speed in m/s 
    distance(k) = sqrt((dist^ 2) + (height^2)); %// NEW - Assign directly to distance array 
    velocity(k) = distance/0.1*60; %// NEW - Assign directly to velocity array 
end %----- 

Этот код должен теперь хранить 77 расстояния и скорости, сохраненные в distance и velocity соответственно. Попробуйте это и дайте мне знать, если это сработает!


Sidenote

Вы можете вычислить это совершенно векторизованного способом без каких-либо for петель. Вы можете использовать diff, чтобы вычислить эти соседние расстояния для вас. Таким образом, вы можете сделать что-то вроде этого:

R=6378.1e3; 
latDistance = diff(copter_llh(1,:)); % // NEW 
lonDistance = diff(copter_llh(2,:)); %// NEW 

a = sin(latDistance/2) .* sin(latDistance/2) + cos(copter_llh(1,1:end-1))... 
    .*cos(copter_llh(1,2:end)) .* sin(lonDistance/2) .* sin(lonDistance/2); 
c = 2 *atan2(sqrt(a), sqrt(1 - a)); 

dist = R * c * 1000; %// convert to meters - NEW - change variable 

height = diff(copter_llh(3,:)); 
distance = sqrt((dist.^2) + (height.^2)); %// NEW 
velocity = distance/0.1*60; %// NEW 

Приведенный выше код должен быть эквивалентен вашему методу for петли, но помните, чтобы всегда писать код, который имеет смысл для вас первым и работает, прежде чем начать делать какие-либо оптимизаций , Это лучший способ кодирования!

+0

Большое спасибо! – Buzz92

+0

@ Buzz92 - Мое удовольствие! Удачи! – rayryeng

Смежные вопросы