【发布时间】:2014-10-15 08:43:33
【问题描述】:
考虑由至少两个穿过原点的平面划分的 5 维空间。如果有n 平面,那么只要它们处于“一般位置”,这个创建的不同金字塔区域的数量就是n^4/24-n^3/4+(23 n^2)/24-(3 n)/4+1,这是我在下面具体说明的一个术语。
通过原点的超平面可以由一个从与平面正交的原点开始的向量来定义。如果定义超平面的三个向量都不共面,则超平面处于一般位置。
如何在 5 维空间中有效地找到每个金字塔区域的一个点?那是 返回
k5d 空间中的点, 每个都在不同的金字塔区域。值k将成为输入的一部分。
到目前为止,我的天真尝试只是使用(在 Python 中)在超球面上随机均匀地选取点
def points_on_sphere(dim, N, norm=numpy.random.normal):
"""
http://en.wikipedia.org/wiki/N-sphere#Generating_random_points
"""
normal_deviates = norm(size=(N, dim))
radius = numpy.sqrt((normal_deviates ** 2).sum(axis=0))
points = normal_deviates / radius
return points
然后选择一个子集,使每个子集位于不同的区域。我可以使用以下代码验证这些点实际上都在不同的金字塔区域中。
def all_in_distinct_pyramidal_regions(testpoints, hyperplanes):
signs = numpy.sign(numpy.inner(testpoints, hyperplanes))
return (len(set(map(tuple,signs)))==len(signs))
这是 3d 中 4 个平面的图片,有 14 个点,每个区域一个(因为 5d 很难绘制),每个平面创建的金字塔区域一个。
是否有一种算法可以在 5 维空间中找到
k点,每个点都在不同的金字塔中 区域并需要 O(nk) 时间?
我注意到金字塔区域是凸的。凸空间在加法下是封闭的,特别是如果你知道形成区域边界的超平面,你可能会通过对超平面上的点求平均来找到区域内的一个点。但是,我不确定如何将这一观察结果转化为一个完全有效的算法。
【问题讨论】:
-
你快到了。找到由 5 个平面(或 3d 示例中的 3 个)的所有组合的交点生成的点。然后添加 10 个额外的(3d 中的 6 个)平面(实际上您可以使用 6 个(3d 中的 4 个),但 10 个可以垂直于轴,这可能会简化事情)围绕这些点形成一个封闭区域。现在确定由所有平面形成的每个封闭凸区域的顶点。半空间相交算法当然是做到这一点的一种方法。可能会有更好的想法。平均这些封闭区域的顶点以获得所需的点。
-
@Gene 在我的问题中有
n超平面,所以你的意思是n超平面的所有组合的所有交集?