任意维度无限体的交集
我需要一些代码、文本、谷歌关键词或者其他资源来实现这个类。速度不是重点,主要是它应该能适用于任意数量的维度。
class InfiniteVolume: # such as a point, line, plane, volume, 4d-volume
def __init__(self, points): # two points for line, three points for plane, etc.
self.points = points
assert all(len(p)==len(points[0]) for p in points)
def vdim(self): # Dimensions of the volume. For example 2.
return len(self.points)-1
def wdim(self): # Dimensions of the world. For example 3.
return len(self.points[0])
def __contains__(self, point):
# ???
def intersect(self, other):
assert self.wdim() == other.wdim()
# ???
1 个回答
6
你想要表示一个N维空间,这个空间嵌套在一个M维空间里。举个例子,当N=2,M=3时,这就相当于在一个三维的“世界”里有一个平面。
你可以定义一组点来表示这个空间,但更自然的方式是用一组线性方程或者基向量来表示,所以这应该是你实现的基础。如果你使用基向量,那么会有N个。如果你使用方程,每个方程会减少一个维度,所以会有M-N个方程。
要找到两个这样的子空间的交集,你只需把它们的集合结合起来,然后简化(得到一组线性无关的向量或方程)。交集的维度可以是从零到N的任何值。
这些技巧很简单,也很常见,属于线性代数的范畴。
编辑:
我觉得处理基向量是最简单的。
- 用这些点来获取基向量。
- 用基向量找到正交空间的基向量(比如如果这个空间是一条二维的线,正交空间就是一条垂直的线;如果是三维的线,正交空间就是与这条线垂直的一个平面;如果是三维的平面,正交空间就是与这个平面垂直的一条线)。
- 如果你愿意,从正交空间的向量中得到这个空间的方程是很简单的。
- 要得到两个空间的交集,先把它们的基结合起来,然后简化为一个基。找到一个共同点,你就完成了。