在矩阵表达式上使用伍德伯里恒等式

时间:2019-07-18 12:18:41

标签: matrix sympy matrix-inverse

tl; dr

如何使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 = IqU = -W.TC = (sigma**2 * Id + W@W.T).IV = W

取消后,答案变为Id + W.T@W

普通substition无法处理这种情况,因为它会用其他表达式替换单个符号...我正在寻找替换子表达式的方法(通过如上所述手动识别A,U,C,V) ,或者可能是“模式”,用于依赖于模式的表达式。

从某种意义上讲,这就像使用带有正则表达式组的正则表达式来替换。

问题

如何得到sympy来计算mat.I并产生Id + W.T@W

0 个答案:

没有答案