2014-09-22 2 views
2

Я подозреваю, что это не может считаться отличным вопросом, но я полностью ударил его по стене и мог использовать некоторую помощь.Перевод цифрового кода на C#

Я пытаюсь реализовать этот код:

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] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html), [numpy.diag] (http://docs.scipy.org/doc/numpy /reference/generated/numpy.diag.html), [numpy.inner] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.inner.html). – CoryKramer

+3

_ "... Ненавижу этот раздел" _ Фрейдистский промах? :) –

+0

Ха-ха, возможно. Что касается документации. Это немного меня портит, чтобы быть честным, в частности, что он делает, когда речь идет о двух массивах, которые пунктирны (dot producted?) Вместе, но даже несмотря на это общая цель того, что делает эта часть кода, немного непонятно мне. – djcmm476

ответ

1

Вот пример расчета, сделано в интерактивной оболочке IPython:

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