我在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
在时间和记忆方面,有没有一种有效的方法可以做到这一点?
答案 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')
有效计算所有距离组合。