如何使sympy代替伍德伯里矩阵身份?
下面的代码段生成矩阵mat
import sympy as s
d=10
q=3
sigma = s.symbols("sigma")
W = s.MatrixSymbol("W",d,q)
Iq = s.Identity(q)
Id = s.Identity(d)
mat =Iq - W.T @ (sigma**2 * Id + W@W.T).I @ W
我想计算表达式mat.I
。这可以通过woodbury matrix identity完成。身份说(A+U@C@V).I
等于A.I - A.I@U@(C.I-V@A.I@U).I@V@A.I
。通过使用替换A = Iq
,U = -W.T
,C = (sigma**2 * Id + W@W.T).I
,V = W
取消后,答案变为Id + W.T@W
。
普通substition无法处理这种情况,因为它会用其他表达式替换单个符号...我正在寻找替换子表达式的方法(通过如上所述手动识别A,U,C,V) ,或者可能是“模式”,用于依赖于模式的表达式。
从某种意义上讲,这就像使用带有正则表达式组的正则表达式来替换。
如何得到sympy来计算mat.I
并产生Id + W.T@W
?