Naj*_*Naj 0 arrays matlab matrix vectorization bsxfun
我有一个矩阵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
Run Code Online (Sandbox Code Playgroud)
cha*_*pjc 10
您的a矩阵是一维向量,与嵌套循环不兼容,嵌套循环计算2D空间中从每个点到另一个点的距离.因此,以下答案适用于在N-by-D矩阵中查找所有成对距离的问题,因为您的循环适用于D=2.
我认为你正在寻找pdist与'euclidean'距离选项.
a = randn(10, 2); %// 2D, 10 samples
D = pdist(a,'euclidean'); %// euclidean distance
Run Code Online (Sandbox Code Playgroud)
按照这个方法,squareform在对角线上得到方形矩阵,如你所愿:
distances = squareform(D);
Run Code Online (Sandbox Code Playgroud)
如果您没有pdist,在统计工具箱中,您可以使用以下方法轻松完成此操作bsxfun:
da = bsxfun(@minus,a,permute(a,[3 2 1]));
distances = squeeze(sqrt(sum(da.^2,2)));
Run Code Online (Sandbox Code Playgroud)
您还可以使用欧几里德(2范数)距离的替代形式,
||A-B|| = sqrt ( ||A||^2 + ||B||^2 - 2*A.B )
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
通过重新形成的等式,解决方案变为:
aa = a*a';
a2 = sum(a.*a,2); % diag(aa)
a2 = bsxfun(@plus,a2,a2');
distances = sqrt(a2 - 2*aa);
Run Code Online (Sandbox Code Playgroud)
如果选项2占用过多内存,则可以使用此方法.
对于大小为1e3乘3(N-by-D)的随机数据矩阵,这里是100次运行的时序(Core 2 Quad,4GB DDR2,R2013a).
pdist):1.561150秒(0.560947秒pdist)bsxfun):2.695059秒bsxfunalt):1.334880秒结果:(i)bsxfun使用替代公式进行计算.(ii)pdist+ squareform期权具有可比性.(iii)之所以squareform花费两倍的时间,pdist可能是因为pdist只计算三角矩阵,因为距离矩阵是对称的.如果你可以不使用方形矩阵,那么你可以避免squareform并在大约40%的时间内用bsxfun(0.5609/1.3348)手动完成计算.