Arrays 求从矩阵中的一个点到矩阵中所有其他点的距离
我有一个矩阵Arrays 求从矩阵中的一个点到矩阵中所有其他点的距离,arrays,matlab,matrix,vectorization,bsxfun,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
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
重要提示:数据_矩阵是D X N,其中D是维度数,N是数据点数 final_dist_pairs=data_matrix'*data_matrix强> 标准=诊断(最终距离对)强> final_dist_pairs=bsxfun(@plus,norms,norms')-2*final_dist_pairs强> 希望有帮助 %还有一件重要的事,
切勿使用MATLAB的pdist函数。这是一个顺序计算,类似于循环,需要很多时间,可能在O(N^2)中,你的
a
矩阵是一个一维向量,与嵌套循环不兼容,嵌套循环在二维空间中计算从每个点到另一点的距离。因此,下面的答案适用于在N-x-D
矩阵中查找所有成对距离的问题,就像循环在D=2
的情况下所做的那样
选项1-pdist
我想您正在寻找使用欧几里德距离选项的
a = randn(10, 2); %// 2D, 10 samples
D = pdist(a,'euclidean'); %// euclidean distance
按照下面的步骤得到对角线上为零的方阵:
distances = squareform(D);
选项2-bsxfun
如果您没有统计工具箱中的pdist
,则可以使用bsxfun
轻松完成此操作:
da = bsxfun(@minus,a,permute(a,[3 2 1]));
distances = squeeze(sqrt(sum(da.^2,2)));
备选案文3——重新拟订的方程式
也可以使用欧几里德(2-范数)距离的另一种形式
||A-B|| = sqrt ( ||A||^2 + ||B||^2 - 2*A.B )
在MATLAB中为大小为NxD
的两个数据数组u
和v
编写此代码
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
如果选项2占用太多内存,则可以使用此方法
时间安排
对于大小为1e3-x-3(N-x-D)的随机数据矩阵,以下是100次运行的计时(Core 2 Quad、4GB DDR2、R2013a)
- 选项1(
pdist
):1.561150秒(在pdist
中为0.560947秒)
- 选项2(
bsxfun
):2.695059秒
- 选项3(
bsxfun
alt):1.334880秒
调查结果:(i)使用bsxfun
进行计算,使用替代公式。(ii)pdist
+squareform
选项的性能相当。(iii)squareform
花费的时间是pdist
的两倍,这可能是因为pdist
只计算三角形矩阵,因为距离矩阵是对称的。如果您可以不使用平方矩阵,那么您可以避免使用squareform
,并且使用bsxfun
(0.5609/1.3348)手动执行计算所需的时间约为40%。这就是我想要的,但感谢所有建议
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
如果第二行是norms=diag(dist_pairs)
,您的代码将无法按编写的方式运行?这是一个输入错误,我想这个人至少可以从中获益这么多!对于bsxfun
版本,如果速度很重要,请使用da=bsxfun(@减号,a,重塑(a.),1,大小(a,2),大小(a,1))代码>我认为这个问题本身是重复的,但是面对忘恩负义,仅仅是在这里的努力就应该得到一个大大的+1。也许我只是感到困惑,因为其他人似乎理解你在问什么。但是,矩阵没有“点”,除非你指的是元素,在这种情况下,答案只是abs(a-a(i,j))
。我的解决方案可能与你之前接受的解决方案有重复之处?问题中的示例显示了从每个点到另一点的距离。当然,这个解决方案很简单,如果你只需要解决方案的一小部分…这个答案中的循环甚至没有意义,矢量化的答案与循环答案不匹配。5x5矩阵中的x和y是什么??而且A
在循环中甚至没有被引用!!!
distances = sqrt((x-xCenter).^2+(y-yCenter).^2