【问题标题】:Finding minimum euclidean distance of two 3d vectors找到两个 3d 向量的最小欧几里得距离
【发布时间】:2025-12-23 08:30:06
【问题描述】:

好的,我有两个大型 3D 二进制数组。我想计算这两个结构的表面点之间的最小距离,以获得数组数据中显示的对象的周长体素之间的距离的输出。

我知道我必须使用bwperim() 函数;即perim_a = bwperim(a,6); & perim_b = bwperim(b,6); 然后觉得我应该能够使用norm() 函数来做类似norm(perim_a - perim_b); 的事情但是我只是不断收到错误'Input must be 2d'。有没有办法将norm() 函数应用于 3D 数据?

【问题讨论】:

  • 要同时处理多个点,您必须使用pdist 而不是norm

标签: matlab euclidean-distance


【解决方案1】:

如果我理解正确,您有两个代表周长的 3D 体素数组 - 您想要一个体素和另一个体素之间的距离。我的方法是这样的(假设 AB 是初始卷,并且它们的大小相同):

Aperi = bwperim(A,6);
Bperi = bwperim(B,6);

现在我们需要非零体素的坐标:

sz = size(A);
[xx yy zz] = meshgrid(1:sz(1), 1:sz(2), 1:sz(3));

indxA = find(Aperi==1);
posA = [xx(indxA(:)) yy(indxA(:)) zz(indxA(:))]; % a Nx3 matrix of x,y,z positions
indxB = find(Bperi==1);
posB = [xx(indxB(:)) yy(indxB(:)) zz(indxB(:))]; % a Mx3 matrix - note N ~= M

现在您有两个 2D 矩阵,您可以计算点之间的差异 - 但您不知道要比较哪些对,因此您需要做更多工作:

delta = bsxfun(@minus, reshape(posA, 1, [], 3), reshape(posB, [], 1, 3) );

现在delta 的维度为 [M N 3],在 posA 和 posB 中的每对点之间存在差异。距离是

distance = sqrt(sum(delta.*delta, 3));

并且对于A中的每个点,到B中最近点的距离为

closest = min(distance);

这将是一个[1 N] 行向量。

要将这些值放回原始矩阵中,您需要回到开始时的索引:

distMatrix = zeros(size(A));
distMatrix(indxA) = closest;

我认为您现在将 B 周长上的最近点与 A 周长上每个点的距离映射到 A 的表面。

如果这能让你找到你正在寻找的答案,请告诉我......

【讨论】:

  • 我不断收到此错误:Error using reshape Product of known dimensions, 3, not divisible into total number of elements, 41418752. Error in D_surf_WP (line 47) delta = bsxfun(@minus, reshape(struc_a, 1, [], 3), reshape(struc_b, [], 1, 3) ); 任何想法如何解决?
  • 我也不确定我为什么要创建'posA/b' 变量
  • 我认为 reshape 应该在 posAposB 上 - 抱歉,在 iPhone 上无法正确检查。如果这不能解决问题,稍后会仔细研究。
  • @user3168953 - 我看到你接受了答案。我认为这意味着我的编辑解决了你的两个问题,这是我的错误(A 而不是 posA)。因此,我现在已经编辑了答案。请让我知道这是否确实正确。