哈士奇WWW
LDL 分解算法仅适用于 Hermitian/对称矩阵。您正在向它传递一个具有随机值的矩阵,该矩阵不太可能是对称的。此外,矩阵乘法应该在不将置换矩阵应用于下三角矩阵的情况下进行。将非对称矩阵传递给 时scipy.linalg.ldl,仅引用矩阵的下三角部分或上三角部分,具体取决于lower关键字参数的值,默认为True。我们可以看到这样做的效果np.isclose():>>> x = np.random.randn(5,5)>>> l, d, p = la.ldl(x)>>> np.isclose(l.dot(d).dot(l.T) - x, 0)[[ True False False False False] [ True True False False False] [ True True True False False] [ True True True True False] [ True True True True True]]在这里,我们看到矩阵的上三角部分被假定为对称的,因此算法返回的值在这种情况下是正确的。下面,我们传递la.ldl一个实际的对称矩阵,得到预期的结果。>>> x = np.array([[1, 2, 3], [2, 4, 5], [3, 5, 6]])>>> l, d, p = la.ldl(x)>>> print(np.isclose(l.dot(d).dot(l.T) - x, 0))[[ True True True] [ True True True] [ True True True]]如果您正在寻找一般的 LDL^T 分解,而没有 permutations,这将进一步减少矩阵的域。您的矩阵也需要是正定的。下面是一个这样的矩阵示例:>>> x = np.array([[2, -1, 0], [-1, 3, -1], [0, -1, 4]])>>> l, d, p = la.ldl(x)>>> larray([[ 1. , 0. , 0. ], [-0.5, 1. , 0. ], [ 0. , -0.4, 1. ]])>>> darray([[2. , 0. , 0. ], [0. , 2.5, 0. ], [0. , 0. , 3.6]])>>> parray([0, 1, 2], dtype=int64)如您所见,排列p是[0, 1, 2],并且l已经是下三角形。