【问题标题】:Calculate shortest distance to selected points in 3D matrix in matlab在matlab中计算到3D矩阵中选定点的最短距离
【发布时间】:2016-06-06 12:13:00
【问题描述】:

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

例如在二维中,给定一个4x4matrix:

    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

在时间和内存方面,有没有一种有效的方法来做到这一点?

【问题讨论】:

  • 你如何定义你的距离?欧几里得?矩阵的 3 个维度是否代表 3 个方向的坐标?
  • 距离确实是欧几里得。 3D 矩阵是医学扫描,因此矩阵中的每个“点”实际上都是一个体素。
  • 有很多可能性,见即:en.wikipedia.org/wiki/Nearest_neighbor_search。我在考虑八叉树,但我没有相关经验。
  • 将你的矩阵重塑为250000 x 40矩阵,然后从这个矩阵中采样得到一个30000 x 40点矩阵,然后使用上面标记的副本。
  • @sdbonte 是的,直到你提到它,我才知道内存存储,我很抱歉在标记之前没有正确看到它。我将删除重复项。我还认为在一个空间坐标上的每个 3D 切片都是一个数据点,而不是实际的体素本身。由于巨大的内存需求,您可能不得不求助于存储在磁盘上或将操作拆分到多个处理器/机器上。无论哪种方式,它都会相当缓慢。

标签: matlab matrix multidimensional-array distance


【解决方案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

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

【讨论】:

  • 感谢您的建议,但如何在实践中使用它?我确实对这些组合不感兴趣。但我真的不明白如何使用convn 命令解决这个问题。
  • 我认为这行不通。例如,对于矩阵 M 中给定的选定点:M = [0 0 0; 1 0 0; 1 0 0],输出将是:distance = [1 sqrt(2) sqrt(3); 0 1 2; 0 1 2]。如果我使用convn 命令,我仍然需要自己计算欧几里得距离,并对所有 10M 体素执行 for 循环,这将非常慢。
【解决方案2】:

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

D = pdist(X,'euclidean')

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

【讨论】:

  • 如果我将所有体素 (10M) 和选定点 (30k) 存储在大小为 X 的向量 (10M+30k) x 3 中并运行 pdistcommand,这将导致大小为矩阵10M*(10M-1)/2 = 5e13,当然会给出“内存不足”的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2015-12-10
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多