将Numpy代码翻译为C#

3
我猜想这可能不是一个很好的问题,但我完全被困住了,需要一些帮助。
我正在尝试实现这段代码:

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

我只是在努力理解发生了什么。我不确定作者所指的特定向量投影,或输出格式(该死的鸭子类型)的含义。描述对我来说有点太模糊了。

有没有人能提出建议或解释这在做什么?任何帮助都将不胜感激。

谢谢。


3
阅读文档:numpy.dot, numpy.diag, numpy.inner - undefined
哈哈,可能吧。关于文档部分,说实话,我有点迷糊,特别是当处理那两个用点号连接(点乘?)在一起的数组时,不过即使如此,这段代码的整体目标对我来说还有点不清楚。 - undefined
3
好的,让我们退后一步。不考虑NumPy实现,你是否理解将点投影到向量上的概念?如果不理解,请快速阅读一下这篇文章,希望数学部分不会让你困惑。 - undefined
哦,所以这个人只是在进行链接中显示的投影,但是对于每个点到三个向量中的每一个都进行了计算,并将其返回为矩阵? - undefined
1个回答

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]])

根据函数文档,输入为(4,3)pointsvectors列表包含2个(3,)向量,输出是一个(4,2)数组pd是一个4x3矩阵与一个2x3(或转置后的3x2)数组的矩阵乘积,结果是一个4x2的数组。v2也可以计算为np.sum(u,u, axis=1),即这2个'vectors'的大小。p就是该点积除以v2的归一化值。
如果您熟悉爱因斯坦求和符号(用于物理学),则该计算也可以表示为:
np.einsum('ij,kj->ik',points,u)/np.einsum('ij,ij->i',u,u)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接