在matlab中计算3D矩阵中选定点的最短距离

时间:2016-06-06 12:13:00

标签: matlab matrix multidimensional-array distance

我在Matlab中存储了一个非常大的3D图像,存储在矩阵(约500x500x40个体素)中。在该矩阵中,选择约30000个点(随机假设)。假设所选择的体素具有值1并且未选择的点是零。现在我需要为整个3D图像中的每个体素计算到最近的选定点的欧几里德距离。

因此,例如在2D中,给定4x4矩阵:

    selection = 0 0 1 0
                1 0 0 0
                0 0 0 1
                0 0 0 0

相应的距离矩阵为:

    distance = 1  1  0  1
               0  1  1  1
               1  √2 1  0
               2  √5 √2 1

在时间和记忆方面,有没有一种有效的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

如果您不需要知道哪些组合具有哪些距离,那么您可以计算3D cross-correlation

为了在2D中说明这一点,请采用以下矩阵并按参考

中所述计算2D相关性
M =
 0     0     0
 1     0     0
 1     0     0

convn(v,v(end:-1:1,end:-1:1)) =
 0     0     0     0     0
 0     0     1     0     0
 0     0     2     0     0
 0     0     1     0     0
 0     0     0     0     0

可以读出它们之间的距离,因为这里的相关矩阵可以理解为指数的差异。 convn 中的中间列表示水平距离为零。同样,中间行表示零垂直距离。因此,中心值会为您提供零距离值的数量,这是矩阵中的距离值的总和。两个对应于M中的垂直距离为1.一个组合具有正距离而另一个组合具有负距离。

因此,您现在拥有所有距离,但它们也包含水平和垂直方向。但你仍然可以按照自己的意愿处理它。

在没有for循环的情况下计算所有可能的平方距离的方法是

n = size(M,1) = 
 3

tmp = repmat([-(n-1):(n-1)].^2,2*n-1,1)
d2 = tmp+tmp' =
 8     5     4     5     8
 5     2     1     2     5
 4     1     0     1     4
 5     2     1     2     5
 8     5     4     5     8

两个矩阵基本上都包含距离的直方图。

答案 1 :(得分:0)

如果您的点以坐标X = n x 3给出,则可以使用

D = pdist(X,'euclidean')

有效计算所有距离组合。