我怀疑这可能不是一个很好的问题,但是我已经完全碰到了它,可以使用一些帮助。
我试图实现此代码:
http://www.nathanieltroutman.net/content/calculating-minimum-volume-bounding-box
在C#中,原文在Python中。
在我点击此部分之前,情况一直很好:
def calcProjections(points, *vectors):
"""Calculates the projection of points (NxD) onto the vectors
(MxD) and return the projections p which is a matrix sized (N, M)
where N is the number of points and M is the number of vectors.
p[i][j], is the projection of points[i] onto vectors[j] (which is
between 0 and 1)."""
u = np.array(vectors)
# project the points onto the vectors into on fell swoop
d = np.dot(points, u.T)
# this is the dot product of each vector with itself
v2 = np.diag(np.inner(u, u))
p = d / v2
return p
我正在努力破译实际发生的事情。我不确定作者的意思是投射到特定的向量,或输出的格式(该死的你打字)。对我来说,这种描述有点过于模糊。
有没有人对这是做什么有任何建议或解释?非常感谢任何帮助。
感谢。
答案 0 :(得分:1)
这是一个示例计算,在交互式Ipython shell中完成:
In [63]: points=np.arange(12,dtype=float).reshape(4,3)
In [64]: vectors=[np.array([1,0,0],dtype=float),np.array([0,1,1],dtype=float)]
In [65]: u=np.array(vectors)
In [66]: points
Out[66]:
array([[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.],
[ 9., 10., 11.]])
In [67]: u
Out[67]:
array([[ 1., 0., 0.],
[ 0., 1., 1.]])
In [68]: d=np.dot(points, u.T)
In [69]: d
Out[69]:
array([[ 0., 3.],
[ 3., 9.],
[ 6., 15.],
[ 9., 21.]])
In [70]: v2=np.diag(np.inner(u,u))
In [71]: d/v2
Out[71]:
array([[ 0. , 1.5],
[ 3. , 4.5],
[ 6. , 7.5],
[ 9. , 10.5]])
如函数doc中所指定,输入为(4,3)
points
,vectors
列出2 (3,)
个向量,输出为(4,2)
数组,p
。
d
是4x3矩阵与2x3(或转置后,3x2)阵列的矩阵(点)乘积,得到4x2。 v2
也可以计算为np.sum(u,u, axis=1)
,即2'向量的大小。 p
只是按v2
标准化的点积。
如果您熟悉爱因斯坦求和符号(用于物理学),计算也表示为:
np.einsum('ij,kj->ik',points,u)/np.einsum('ij,ij->i',u,u)