【问题标题】:3D variant for summed area table (SAT)总面积表 (SAT) 的 3D 变体
【发布时间】:2013-12-25 01:18:56
【问题描述】:

根据维基百科:

summed area table 是一种数据结构和算法,用于在网格的矩形子集中快速有效地生成值的总和。

对于 2D 空间,可以通过在所需范围内迭代 x,y 来生成总面积表,

I(x,y) = i(x,y) + I(x-1,y) + I(x,y-1) - I(x-1,y-1)

而用于矩形角的query 函数A(top-left)B(top-right)C(bottom-right)D 可以通过以下方式给出:-

I(C) + I(A) - I(B) - I(D)

我想将以上内容转换为 3D。另请告知是否有其他方法/数据结构可用于计算 3D 空间中的部分和。

【问题讨论】:

  • 维基百科条目没有在“扩展”部分回答这个问题吗?我相信它给出了底部高维空间的公式。
  • 是的,我尝试理解,但无法完全掌握。你能解释一下吗?

标签: algorithm data-structures 3d cumulative-sum


【解决方案1】:

我不确定,但可以想到以下内容。 (我没有浏览过维基百科代码)

对于每个坐标 (x,y,z),求从 (0,0,0) 到该元素的所有元素的总和。
将其称为 S(0,0,0 到 x,y,z) 或 S0(x,y,z)。
这可以通过遍历 3D 矩阵一次来轻松构建。

S0( x,y,z ) =  value[x,y,z] + S0(x-1,y-1,z-1) + 
               S0( x,y,z-1 ) + S0( x, y-1, z ) + S0( x-1, y, z ) 
               - S0( x-1, y-1, z ) - S0( x, y-1, z-1 ) - S0( x-1, y, z-1 )

(基本元素值 + S0(x-1,y-1,z-1) + 3 个面 (xy,yz,zx))

现在对于每个查询 (x1,y1,z1) 到 (x2,y2,z2),首先转换坐标,使 x1,y1,z1 是长方体最靠近原点的角,x2,y2,z2 是离原点最远的角。

S( (x1,y1,z1) to (x2,y2,z2) ) = S0( x2,y2,z2 ) - S0( x2, y2, z1 ) 
                                - S0( x2, y1, z2 ) - S0( x1, y2, z2 )
                                + S0( x1, y1, z2 ) + S0( x1, y2, z1 ) + S0( x2, y1, z1 )
                                - S0( x1, y1, z1 )

(可能会更正)

【讨论】:

  • 你将如何制作 S0 矩阵?
  • @Ninja420 查看我的更新。它需要 3D 可视化,但我认为如果你明白了这将不会太困难。
  • S0( x1, y1, z1 ) 出现了两次,其中一个应该是 x1,y2,z2 我猜
【解决方案2】:

聚会有点晚了,但无论如何。在Wikipedia 中有一个n 维空间的通用公式,在this paper 中提供。按照该符号,我们假设您对由具有角 (x0,y0,z0) 和 (x1,y1,z1) 的矩形框指定的体积感兴趣。然后,有一个完整的图像(体积),系数将是: S((x0,y0,z0) 到(x1,y1,z1)) = S(x1,y1,z1) - S(x1,y1,z0) - S(x1,y0,z1) + S(x1,y0,z0) - S(x0,y1,z1) + S(x0, y1,z0) + S(x0,y0,z1) - S(x0,y0,z0)

这是我用来计算它们的matlab代码(可以指定维度)

%number of dimensions
nDim = 3;
for i=1:2^nDim
        str=dec2bin(i-1,nDim);
        strout='index combo (';
        sum=0;
        for n=1:nDim
            strout = strcat(strout,str(n));
            sum=sum + str2num(str(n));
        end
        strout = strcat(strout,') sign: ',num2str((-1)^(nDim-sum)));
        disp(strout);
end

哪个输出:

(000) sign:-1
(001) sign:1
(010) sign:1
(011) sign:-1
(100) sign:1
(101) sign:-1
(110) sign:-1
(111) sign:1

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 2011-01-21
    • 2013-06-12
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2014-04-04
    相关资源
    最近更新 更多