在matlab中计算到三维矩阵中选定点的最短距离



我在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

从时间和记忆的角度来看,有没有一种有效的方法可以做到这一点?

如果您不需要知道哪些组合具有哪些距离,那么您可以计算3D互相关。

为了在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中的中心列表示水平距离为零。同样,中间一行表示零垂直距离。因此,中心值给出了零距离值的数量,这是矩阵中1的总和。这两个组合对应于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

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

如果您的点被指定为坐标X=n X 3,您可以使用

D = pdist(X,'euclidean')

以有效地计算距离的所有组合。

最新更新