2013-01-23 45 views
7

Tôi có một khu vực với khoảng 144 điểm. Những gì tôi muốn đạt được là để đo khoảng cách của một điểm với tất cả những người khác và lưu trữ nó trong một mảng. Tôi muốn làm điều này cho tất cả các điểm. Nếu có thể tôi muốn lưu trữ dữ liệu này theo cách mà không có sự lặp lại. Và tôi sẽ có thể thực hiện các truy vấn như- Tất cả khoảng cách giữa tất cả các điểm không lặp lại, tổng của tất cả các khoảng cách cho điểm no56, v.v.Tính toán khoảng cách của tất cả các điểm trong một khu vực với nhau

Tôi có một mảng 3 * 144 với hai cột lưu tọa độ của các điểm .

+0

Tôi chỉ nhận thấy câu hỏi này và muốn đưa ra một liên kết đến [câu trả lời này bằng cách so sánh ba phương pháp tính toán khoảng cách cặp đôi trong MATLAB] (http://stackoverflow.com/a/19456458/2778484). Câu hỏi khác là khó hiểu một cách khủng khiếp, nhưng câu trả lời giải quyết khoảng cách cặp đôi, phương pháp cuối cùng trong bất kỳ thứ nguyên nào. – chappjc

Trả lời

6

Một giải pháp có thể (tôi không thực sự rõ ràng với những gì bạn có nghĩa là không có sự lặp lại, mặc dù):

X are your points with coordinates x = X(:,1), y = X(:,2) 


dist = sqrt(bsxfun(@minus,X(:,1),X(:,1)').^2 + bsxfun(@minus,X(:,2),X(:,2)').^2) 

nên

dist(i,j) is the euclidean distance between i and j 

dĩ nhiên là ma trận đối xứng. Bạn có thể dễ dàng giảm sự phức tạp liên quan.

+0

Bằng cách lặp lại tôi có nghĩa là khoảng cách từ điểm A đến B giống với điểm B đến A, vì vậy nó không được tính. – Vikram

+0

@Vikram, Phải, ma trận thực sự là đối xứng. Nhân tiện, đối với số lượng nhỏ các điểm (như 144), có lẽ cách tiếp cận giống như bạo lực hơn này nhanh hơn phương pháp thông minh hơn. Chỉ cần cung cấp cho nó một thử. – Acorbe

2

Giả sử mảng của bạn là A, trong đó mỗi cột lưu trữ tọa độ của một điểm. Để có được sự kết hợp của tất cả các cặp điểm (không lặp lại), sử dụng nchoosek:

pairs = nchoosek(1:size(A, 2), 2) 

Sau đó tính toán Euclidean distance như vậy:

dist = sqrt(sum((A(:, pairs(:, 1)) - A(:, pairs(:, 2))) .^ 2, 1)) 

Nếu bạn có các Statistics Toolbox cài đặt, bạn có thể sử dụng pdist(A) thay cho cùng một hiệu ứng.

+0

Tôi có chức năng pdist. [4] trong [pdist (A)] [4] tài khoản gì? – Vikram

+0

@Vikram nó chỉ là một lỗi đánh máy (tôi đã cố gắng tạo một siêu liên kết đến tài liệu chính thức 'pdist'). Nó phải là 'pdist (A) '. Đã sửa. –

1

Nếu bạn có số liệu thống kê hộp công cụ, và nếu bạn có tất cả các dữ liệu của bạn trong mảng X, sau đó

D = pdist(X) 

mang đến cho tất cả các khoảng cách giữa cặp tất cả các điểm trong X.

+0

Giải pháp dễ nhất nếu bạn có thể sống với ma trận hình tam giác thay vì ma trận khoảng cách đối xứng (mặc dù ['squareform'] (http://www.mathworks.com/help/stats/squareform.html) có thể giúp bạn hoàn thành) . +1 Để tham khảo, hãy xem [câu trả lời của bài đăng này để so sánh 'pdist' và các giải pháp" thủ công "khác] (http://stackoverflow.com/a/19456458/2778484). – chappjc

Các vấn đề liên quan