import sympy as sym
from sympy import symbols
x1,x2,x3 = symbols('x1,x2,x3')
X = sym.Matrix([[x1],[x2],[x3]])
print(X)
A = sym.Matrix([[1,0,1], [0,1,1],[1,1,0]])
print(A)
print(X.T*A*X)
D = sym.diff(X.T*A*X , X)
print(D.shape)
print(D)
print(D[0])
print(D[0][0])
print(D[0][0][0])
print(D[0][0][0][0])
上面的输出如下:
Matrix([[x1], [x2], [x3]])
Matrix([[1, 0, 1], [0, 1, 1], [1, 1, 0]])
Matrix([[x1*(x1 + x3) + x2*(x2 + x3) + x3*(x1 + x2)]])
(3, 1, 1, 1)
[[[[2*x1 + 2*x3]]], [[[2*x2 + 2*x3]]], [[[2*x1 + 2*x2]]]]
[[[2*x1 + 2*x3]]]
[[2*x1 + 2*x3]]
[2*x1 + 2*x3]
2*x1 + 2*x3
所以这意味着 D 是一个 4D 数组。有人可以告诉为什么 sympy.diff 返回 4D 数组吗? (它应该是形状为 (3,1) 的二维数组)
它应该是形状为 (3,1) 的二维数组 所以我期待一个 ans : [[2x1 + 2x3], [2x2 + 2x3], [2x1 + 2x2]] 相反,我得到: [[[[2x1 + 2x3]]],[[[2x2 + 2x3]]],[[[2x1 + 2x2]]]]
如果你检查一下,
(X.T*A*X).shape
是(1,1)
,而这实际上应该是一个标量。这扰乱了 diff
操作。提取单个结果可以解决问题,即
D = sym.diff((X.T*A*X)[0], X)