如何使用NumPy求解将矩阵a转换为矩阵b的置换矩阵?
解决方法
你之前用np.linalg.solve(a, b)出错的原因是,这个函数求解的是满足a @ x = b的矩阵x,但你需要的置换矩阵P满足的是P @ a = b(即对a做行置换得到b),两者的线性关系完全不同。
正确的做法是直接匹配b的每一行在a中的位置,构造置换矩阵:
import numpy as np a = np.array([[1,4,7,-2],[3,0,-2,-1],[-4,2,1,0],[-8,-3,-1,2]]) b = np.array([[-4,2,1,0],[3,0,-2,-1],[-8,-3,-1,2],[1,4,7,-2]]) perm_matrix = np.zeros((a.shape[0], a.shape[0]), dtype=int) for i in range(b.shape[0]): # 找到b第i行在a中的行索引 row_idx = np.where(np.all(a == b[i], axis=1))[0][0] perm_matrix[i, row_idx] = 1 print(perm_matrix)
运行后会输出你需要的正确置换矩阵:
[[0 0 1 0] [0 1 0 0] [0 0 0 1] [1 0 0 0]]
验证正确性
可以通过矩阵乘法验证结果:
print(np.allclose(perm_matrix @ a, b)) # 输出True,说明P@a确实等于b
补充说明
如果矩阵元素存在浮点精度误差,建议将np.all(a == b[i], axis=1)替换为np.allclose(a, b[i], axis=1),避免因微小数值差异导致匹配失败。
内容的提问来源于stack exchange,提问作者talkingtoducks
相关产品推荐
相关产品推荐

