【问题标题】:Calculating distance of all the points storing in one array with all other points of second array计算存储在一个数组中的所有点与第二个数组的所有其他点的距离
【发布时间】:2016-01-27 21:03:29
【问题描述】:

我需要计算存储在大小为 的数组中的所有点与大小为 的其他数组的所有点的距离。存储在两个数组中的点的形式为:

A = 341 45 456 32 987 10 4003 332 …… …… .... ....

B = 344 67 786 90 1234 47 3456 222 …… …… .... ....

我必须计算所有点的距离。例如,算法计算 (341,45) 和 (344,67) 之间的距离,然后是 (341,45) 和 (780,90),然后是 (341,45) 和 (1234,47),然后是 (341, 45) 和 (3456,222) 然后 (456 32) 和 (344,67) 等等。非常感谢您的帮助

【问题讨论】:

  • 到目前为止您尝试过什么?你有什么想法?顺便说一句:你熟悉复数吗?
  • 你看pdits2了吗?

标签: matlab image-processing


【解决方案1】:

你可以使用Matlab's builtin pdist2 function:

d = pdist2(A,B);

【讨论】:

  • 不应该重塑矩阵 A 和 B 两个首先使它们成为二维的吗? A2d = reshape( A, 2, length(A)/2 ) ...
  • 是的,但是在问题中他写了<17642065x2 double>等,所以我假设它已经是一个二维数组
  • 我用过这个命令,但 Matlab 给出错误“内存不足。为您的选项键入 HELP MEMORY”。
  • 那是因为答案太大而无法保存在计算机的 RAM 中。您应该将数组分解为更小的子数组,并分别处理每个子数组。
  • 我已经解决了这个错误。当我执行内存命令时,MATAB 给出: 最大可能数组:8840 MB(9.270e+09 字节)* 可用于所有数组的内存:8840 MB(9.270e+09 字节)* MATLAB 使用的内存:1809 MB(1.897e +09 字节)物理内存(RAM):4018 MB(4.213e+09 字节)* 受限于可用的系统内存(物理 + 交换文件)。这表明我有 6931MB 的内存,但命令 pdist2 仍然给出同样的错误。
【解决方案2】:

我认为matheburg在这个问题上的答案( Efficiently compute pairwise squared Euclidean distance in Matlab) 回答您的问题。它甚至比pdist2 还要快,当您必须在多个数组上进行此计算时,它会很有用。

【讨论】:

  • 我已经实现了 matheburg 提出的代码,但 Matlab 给我的错误是“整数类不完全支持使用 * MTIMES 时出错。至少一个输入必须是标量。要计算元素 TIMES,请使用TIMES (.*) 代替。给我建议如何解决这个问题
  • 我根据您的部分矩阵尝试了以下代码并且没有问题(输出为 3x3 矩阵):d=2;numA=3; numB=3:A=[341 45;456 32;987 10]; B=[344 67; 786 90; 1234 47]; helpA=zeros(numA,3*d); helpB=zeros(numA,3*d);对于 idx = 1:d helpA(:,3*idx-2:3*idx) = [ones(numA,1), -2*A(:,idx), A(:,idx).^2 ]; helpB(:,3*idx-2:3*idx) = [B(:,idx).^2 , B(:,idx), one(numB,1)];结束 distMat = helpA * helpB';输出为 distMat=[ 493 200050 797453; 13769 112264 605509; 416698 46801 62378]
  • 你在上面提到的矩阵大小上运行了这段代码吗?当我在该矩阵上运行此代码时,它给了我 CAT 参数尺寸不一致的错误。
  • 你能解释一下代码的工作原理吗?我会非常感谢你
  • 您能告诉我您的电子邮件 ID,以便我可以与您分享我的数据。
最近更新 更多