我在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')
以有效地计算距离的所有组合。