我有一个矩阵a
,我想计算从一个点到所有其他点的距离。所以结果矩阵确实应该为零(在我选择的那一点)并且应该在某个特定点附近显示为某种数字圆圈。
这就是我已经拥有但我似乎无法得到正确的结果。
a = [1 2 3 4 5 6 7 8 9 10]
for i = 2:20
a(i,:) = a(i-1,:) + 1;
end
N = 10
for I = 1:N
for J = 1:N
dx = a(I,1)-a(J,1);
dy = a(I,2)-a(J,2);
distance(I,J) = sqrt(dx^2 + dy^2)
end
end
答案 0 :(得分:10)
您的a
矩阵是一维向量,与嵌套循环不兼容,嵌套循环计算2D空间中从每个点到另一个点的距离。因此,以下答案适用于在N-by-D
矩阵中查找所有成对距离的问题,因为您的循环适用于D=2
的情况。
我认为您正在寻找'euclidean'
距离选项的pdist
。
a = randn(10, 2); %// 2D, 10 samples
D = pdist(a,'euclidean'); %// euclidean distance
按照squareform
的说法,在对角线上找到方形矩阵,如下所示:
distances = squareform(D);
如果您没有统计工具箱中的pdist
,则可以使用bsxfun
轻松完成此操作:
da = bsxfun(@minus,a,permute(a,[3 2 1]));
distances = squeeze(sqrt(sum(da.^2,2)));
您还可以使用欧几里德(2范数)距离的替代形式
||A-B|| = sqrt ( ||A||^2 + ||B||^2 - 2*A.B )
在MATLAB中为大小为u
的两个数据数组v
和NxD
编写此内容,
dot(u-v,u-v,2) == dot(u,u,2) + dot(v,v,2) - 2*dot(u,v,2) % useful identity
%// there are actually small differences from floating point precision, but...
abs(dot(u-v,u-v,2) - (dot(u,u,2) + dot(v,v,2) - 2*dot(u,v,2))) < 1e-15
通过重新制定的等式,解决方案变为:
aa = a*a';
a2 = sum(a.*a,2); % diag(aa)
a2 = bsxfun(@plus,a2,a2');
distances = sqrt(a2 - 2*aa);
如果选项2占用太多内存,则可以使用此方法。
对于大小为1e3-by-3(N-by-D)的随机数据矩阵,这里有100次运行的时序(Core 2 Quad,4GB DDR2,R2013a)。
pdist
):1.561150秒(pdist
中0.560947秒)bsxfun
):2.695059秒bsxfun
alt):1.334880秒调查结果:(i)使用bsxfun
进行计算,使用替代公式。 (ii)pdist
+ squareform
选项具有可比性。 (iii)squareform
花费两倍于pdist
的时间的原因可能是因为pdist
仅计算三角矩阵,因为距离矩阵是对称的。如果你没有方形矩阵,那么你可以避免squareform
并使用bsxfun
(0.5609 / 1.3348)手动完成所需的大约40%的时间进行计算。
答案 1 :(得分:-1)
这就是我想要的,但感谢所有的建议。
A = rand(5, 5);
select_cell = [3 3];
distance = zeros(size(A, 1), size(A, 2));
for i = 1:size(A, 1)
for j = 1:size(A, 2)
distance(i, j) = sqrt((i - select_cell(1))^2 + (j - select_cell(2))^2);
end
end
disp(distance)
您也可以使用矢量化来改进它:
distances = sqrt((x-xCenter).^2+(y-yCenter).^2
答案 2 :(得分:-3)
重要提示:data_matrix是D X N,其中D是维数,N是数据点数!
<强> final_dist_pairs = data_matrix'* data_matrix; 强>
规范= diag(final_dist_pairs);
final_dist_pairs = bsxfun(@ plus,norms,norms') - 2 * final_dist_pairs; 希望它有所帮助!
%另一个重要的事情, 永远不要使用MATLAB的pdist函数。这是一个顺序评估,就像循环一样,需要花费很多时间,可能在O(N ^ 2)