2017-01-10 3 views
-1

Я хочу вычислить следующие две матрицы P и Q в сжатой форме, так что вместо того, чтобы перебирать все индексы, я могу вычислить матрицы одним выстрелом.Упрощенная реализация уравнения с участием матриц

enter image description here

Можно ли предложить мне, что было бы эффективным способом вычислить эти матрицы P и Q в питоне? Я использую код для моей реализации. Я хочу, чтобы избежать циклов по индексам i и j и вместо этого вычислить P в одном выражении.

import numpy as np 

def sum_matrices(i,j): 
     a=0; 
     for m in range(M+1): 
      a+= p[m]*W[m][i]*np.dot(A[m][j][:],x); 
return a; 

for i in range(N): 
    for j in range(N): 
      P[i][j]=sum_matrices(i,j); 
+1

'numpy' поддерживает общеправительственного матричные вычисления –

+0

Вы имеете в виду вычисление каждого элемента $ P $ путем циклизации по i и j и с использованием приведенной выше формулы? – pikachuchameleon

+0

Пожалуйста, покажите свою текущую реализацию, которую вы хотели бы улучшить, я бы предположил, что мне было бы легче понять, что вам нужно видеть в коде, затем в математике. –

ответ

2

Таким образом, в numpy терминах

W - (M,N) shape, dtype float 
A - (M,N,N) 
x - (N,) 
p - (M,) 

Переводя свои уравнения, на лету, Эйнштейну нотацию, а затем np.einsum, я думаю, что вы хотите:

Ax = np.einsum('mjk,k->mj', A, x) # sums on k 
P = np.einsum('m,mi,mj->ij', p, W, Ax) # sums on m 
pW = np.einsum('m,mi->i', p, W)  # sums on m 
Q = np.einsum('m,i,mj->ij', p, pW, Ax) # sums on m 

Очевидно, что нужно для тестирования с малыми M и N и массивами образцов. Я также не пытался понять глубины уравнений; Я сосредоточился главным образом на нотации индексации.

===============

Я переделок вам код, как:

def sum_matrices(i,j): 
     a=0; 
     for m in range(M): 
      a+= p[m]*W[m, i]*np.dot(A[m,j],x); 
     return a; 

def sum_matrices(i, j): 
     Ax = np.array([np.dot(A[m,j,:], x) for m in range(M)]) 
     a = p * W[:, i] * Ax 
     return a.sum() 

Смотрите также Multiple matrix multiplication

+0

Есть ли в любом случае цикл for для i и j можно устранить? Я должен много раз вычислять эти матрицы P и Q. Поэтому я чувствую, что запуск двух циклов будет очень медленным. – pikachuchameleon

+0

Формы 'einsum' не замыкаются. – hpaulj

+0

Мой плохой. Настолько эффективно, что вышеупомянутый ответ - это 3 разных решения одной и той же проблемы? Два из них связаны с циклами и einsum, которые не связаны с ними. Является ли einsum обычно медленным или быстрым по сравнению с подходами, описанными выше? – pikachuchameleon

Смежные вопросы