2015-09-02 2 views
2

Я попытался создать функцию в MATLAB, которая возвращает вектор расстояний между соседними точками в списке точек (x1,y1),...,(xn,yn).MATLAB: Функция возвращает одно значение вместо вектора

То, что ["distance (x1,y1) to (x2,y2)", ... ,"distance (xn-1,yn-1) to (xn,yn)","distance (xn,yn) to (x1,y1)"].

Для этого моя идея состояла в том, чтобы работать с вектором: Оригинальный [(x1,y1),...,(xn,yn)] и [(xn,yn),(x1,y1),...,(xn-1,yn-1)].

Теперь я построил эту функцию:

function erg = distVec(xy1) 

n = length(xy1); 
xy2 = cat(1,xy1(2:end,:),xy1(1,:)); 
% define snd vector 
erg = []; 
    for j=n 
     erg = cat(2,erg,norm((xy1(j,:)-xy2(j,:)))); 
     % norm(...) equals distance between two neighboring points 
    end 
end 

Но вместо вектора с расстояниями, эта функция возвращает только последний расстояние оцененного.

Что не так?

Спасибо!

+0

MATLAB не позволяет использовать такие кортежи. В вашем коде, какой тип 'xy1' должен иметь? – Jubobs

+0

Это матрица с x-значениями в первом столбце и значениями y в snd. – sabs

ответ

4

Оказывается xy1 является матрицей из двух столбцов, в котором каждая точка является строкой. Затем вы можете получить результат без петель следующим образом:

result = sqrt(sum((xy1([2:end 1],:) - xy1).^2, 2)); 

То есть: циклически сдвинуть на одну строку (xy1([2:end 1],:)), вычесть исходную матрицу (- xy1), квадратный поэлементно ((...).^2), сумма по каждой строке (sum(... ,2)), и взять квадратный корень (sqrt(...)).

+0

Ты будешь уверен, спасибо за этот простой способ! Я работаю с Matlab только на неделю, так что мое программирование еще не очень элегантно. – sabs

3

Ну, length(xy1) возвращает, конечно, длину вектора, например. 7.

Вы для петли for j=n, таким образом, для j=7. Он не возвращает последнее пройденное расстояние, оно возвращает только пройденное расстояние.

Изменения цикла для for j=1:n

+0

О нет, мне сейчас стыдно! Иногда ошибки настолько просты, что вы их просто не видите ... Спасибо! – sabs

+1

Хорошо видно! Я не мог понять код :-) –

+0

@sabs Если он решил вашу проблему, подумайте о том, чтобы принять ответ, но, скорее всего, вы тоже увидите, что говорит Луис. –

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