#sympy
#sympy
Вопрос:
Я хочу указать матрицу 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 локально.