Быстрый способ умножения матриц в Python

Кто-нибудь знает быстрый способ вычисления матриц, таких как:

Z{i,j}  = \sum_{p,k,l,q} \frac{A_{ip} B_{pk} C_{kl} D_{lq} E_{qj} }{a_p - b_q - c}

введите здесь описание изображения

Для обычного умножения матриц я бы использовал numpy.dot(a,b),, но теперь мне нужно разделить элементы на $a_p$ и $b_q$.

Какие-либо предложения?

Любые предложения о том, как вычислить

$$ C_{i,j} =  \sum _p = \frac{E_{i,p} B_{p,j}}{m_p} $$

тоже очень поможет.


person Odile    schedule 21.09.2015    source источник
comment
что это за матрица?   -  person Anand S Kumar    schedule 21.09.2015
comment
это двумерная матрица. Кроме того, матрицы A, B, C, D и E являются двумерными.   -  person Odile    schedule 21.09.2015
comment
Вы уверены, что это b_q? q используется для обозначения D и E и, насколько я понимаю, может быть даже вне индексов B (например, D может быть 2X40, а E 40X2, A, B и C могут быть 2X2, что сделал бы aq равным 3 вне сферы действия B). Кстати, отредактируйте код второй формулы, чтобы мы видели ее как первую.   -  person rlinden    schedule 21.09.2015
comment
@rlinden, да, я уверен, что это b_q. Извините, но я не знаю, как редактировать код, это сделал кто-то другой. Матрицы A, B, C, D и E имеют одинаковую форму (n x n), а длина a и b равна n.   -  person Odile    schedule 21.09.2015


Ответы (1)


Обратите внимание, что (E[i, p] * B[p, j]) / m[p] равно E[i, p] * (B[p, j] / m[p]), поэтому вы можете просто разделить m на B перед вызовом np.dot.

def f(E, B, m):
    B = np.asarray(B)  # matrix
    m = np.asarray(m).reshape((B.shape[0], 1))  # row vector
    return np.dot(E, B / m)  # m is broadcasted to match B
person Mathias Rav    schedule 21.09.2015