【问题标题】:Distance in n-dimensional spacen维空间中的距离
【发布时间】:2026-01-31 10:50:01
【问题描述】:

我有一个 5x100 矩阵,其中每一行代表一个特定点,每一列是该点在 5 维空间中的坐标。这意味着实际上总共有 100 分。

如何计算每个点之间的距离以找到彼此最近的 5 个点?

我已经为二维空间做到了这一点

dist=sqrt(bsxfun(@minus,o(1,:),o(1,:)').^2+bsxfun(@minus,o(2,:),o(2,:)').^2)
sorted=sort(dist,1, 'ascend')
fin=sorted(1:5,:)
summ=sum(fin)
[M,I]=min(summ)
sol=dist(:,I)
[Bsort Bidx]=getNElements(sol,5)
oTemp=o(:,[Bidx])

但是当涉及到多维问题时,我找不到有效的解决方案。

谢谢。

【问题讨论】:

  • 不要太迂腐,但一个 5x100 矩阵有 5 行 100 列,所以你的意思是 100x5 矩阵或者每列代表 5 个维度中的一个点(并且有 100 个)或者每一行代表 100 个维度中的一个点(并且有 5 个维度)。
  • 是的,对不起,你是对的。我正在使用 100x5 矩阵,然后转置它。

标签: arrays matlab optimization multidimensional-array


【解决方案1】:

您似乎想要每个点之间的欧几里得距离。有一个名为 pdist 的内置 MATLAB 函数应该可以满足您的需求。默认情况下,它需要一个矩阵M,观察对应于行,变量对应于列,因此出于您的目的,您应该转置输入矩阵。

M = rand(5,100);
D = pdist(M','euclidean');

输出 D 将是一个向量。如果你想要(对称)矩阵形式,可以使用squareform

Dmat = squareform(D);

所以Dmat(i,j) 将是点M(:,i)M(:,j) 之间的欧几里得距离。

然后,要找到 5 个最小的元素,您可以对 Dmat 的线性表示进行排序,取前 5 个索引,然后使用 ind2sub 得到您要查找的 is 和 js :

[~, ind] = sort(Dmat(:), 'descend');
ind = ind(1:5);
[r, c] = ind2sub(size(Dmat), ind);

【讨论】:

    【解决方案2】:

    sqrt(sum(bsxfun(@minus,reshape(m,100,1,5),reshape(m,1,100,5)).^2,3)) 应该这样做,如果矩阵被称为 m 和一个 100x5 的 5 维 100 个点的矩阵。

    如果您使用的是 MATLAB R2016b 或更高版本,您甚至可以使用:sqrt(sum((reshape(m',100,1,5)-reshape(m',1,100,5)).^2,3))

    【讨论】:

    • 这在高维情况下当然可能会出现问题,因为它会生成一个 p x p x d 矩阵(p 是点数,d 是维度)作为计算的一部分 -这可能会占用大量内存!如果这是一个问题,您可以随时使用 for 循环!
    • 非常感谢。我正在使用 Matlab 2014,您的解决方案正在运行。顺便问一下,您有与 CVX 合作的经验吗?我有 2 个 5 维数据集,我需要从中选择 5 个点以将其括在省略号中。什么会导致 CVX 可以解决一个数据集但无法解决另一个数据集的问题?
    • 对不起!我没有使用 CVX 的经验。