Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 求从矩阵中的一个点到矩阵中所有其他点的距离_Arrays_Matlab_Matrix_Vectorization_Bsxfun - Fatal编程技术网

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