Есть ли способ в Sympy упростить матричную алгебру? Скажем, с идентичностью Вудбери

#sympy

#sympy

Вопрос:

x

Я хочу указать матрицу N x M, где N>> M и использовать woodbury, а для Sympy упростить матричную алгебру.

Возможно ли это или что-то подобное?

Ответ №1:

Есть ли способ в Sympy упростить матричную алгебру? Скажем, с идентичностью Вудбери

Да, можно применить идентификатор Вудбери. В приведенном ниже коде идентификатор применяется к (I Phi^T * Phi)**(-1) .

В конкретном случае использовался (I UV)^-1 = I - U*(I VU)^-1*V

 from sympy.simplify.simplify import nc_simplify
from sympy import *
N,M,sigma = symbols("N M sigma")
Phi = MatrixSymbol("Phi", N, M)
In,Im = Identity(N), Identity(M)

f = (Im   Phi.transpose()@Phi).inverse()
f = f @ Phi.transpose()
f = Phi @ f
f = In - sigma**(-2)*f
f = sigma**(-2)*Phi.transpose()@f
f = f@ Phi


def apply_woodburry_1(e,U,V):
    # The Woodbury identity
    #
    # (I UV)^-1 = I - U * (I VU)^-1 * V
    # 
    # Below, P will be LHS and Q will be RHS
    #
    UV_dim = (U * V).shape
    I1 = Identity(UV_dim[0])
    VU_dim = (V * U).shape
    I2 = Identity(VU_dim[0])
    
    P = (I1 U*V)**(-1)
    Q = I1 - U * ( (I2 V*U)**(-1) ) * V
    
    return e.replace(P,Q)


display(f)
f = apply_woodburry_1(f,Phi.transpose(),Phi)
display(f)
f = nc_simplify(f.expand())
display(f)
 

Вывод:

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

Комментарии:

1. Спасибо, это выглядит круто!, я получаю «некоммутативные скаляры в MatMul не поддерживаются».

2. @JimSi вы получали это раньше или теперь с этим кодом выше?

3. Для его запуска использовался SymPy 1.7.1. Я запустил его внутри Jupyter локально.