2014-11-16 2 views
3

У меня есть матрица с размером NxM и один вектор с длиной M. Мне нужно наименьшее расстояние от всех расстояний между каждой строкой матрицы и единственным вектором.Наименьшее расстояние между матрицей и вектором

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

matrix2 = repmat(vector, N, 1); 
norm(matrix1 - matrix2, 2) 

ответ

1

Позвольте мне показать это на примере:

m = rand (5, 2); # Your matrix with reference points 
v = rand (1, 2); # Your vector 

tmp = bsxfun(@minus, m, v); 
d = hypot (tmp(:,1), tmp(:,2)); # Difference between v and all rows in m 

# Find samllest distance 
[dmin, ix] = min (d) 

# visualize it 
scatter (m(:,1), m(:,2), 8, "red"); 
hold on 
plot([v(1), m(ix, 1)], [v(2), m(ix, 2)], "-*") 
hold off 

print ("out.png") 

красные пузыри являются точками в м (2D случай) и «*» один v Синяя линия соединяет V с одним из. м, ближайшего к.

Smallest distance

1

Я думаю, на octave, вы можете использовать automatic broadcasting, чтобы получить расстояния без repmat-ing или с помощью norm как так -

dist = sum((matrix1 - vector).^2,2) 

На MATLAB, вы можете избежать repmat с bsxfun, как это -

dist = sum(bsxfun(@minus,matrix1,vector).^2,2) 

И, если вы все еще хотите продолжить repmat, вы можете получить расстояние, как так -

matrix2 = repmat(vector, N, 1); 
dist = sum((matrix1 - matrix2).^2,2) 

Наконец, чтобы получить наименьшее расстояние и соответствующий индекс строки, вы можете использовать min -

[smallest_dist,minrow_ind] = min(dist)