如何定义任意阶数(s-1)×(s-1)的可逆矩阵Q_hat?
生成指定阶数的可逆矩阵$Q_{\text{hat}}$的正确方法
先说说你之前代码的问题:
- 第一种用
None初始化矩阵,之后直接把E1赋值为单位矩阵,这完全没实际构建可逆关系,Q_{\text{hat}}还是全None的无效矩阵。 - 第二种用
[random.randint(1,10)]*(s-1)生成行的方式有坑,这会让矩阵的每一行都是同一个列表的引用,修改任意一行其他行都会跟着变;而且用*做矩阵乘法是元素逐个相乘,不是线性代数里的矩阵乘法,要做矩阵乘法得用@或者np.dot();另外随机生成的整数矩阵有可能不可逆,得验证。
下面给几种靠谱的实现方式:
方法1:随机生成后验证可逆性
先随机生成矩阵,然后检查行列式是否不为0(方阵可逆的充要条件),直到生成符合要求的矩阵:
import numpy as np import random s = 5 size = s - 1 Q_hat = None while Q_hat is None or np.linalg.det(Q_hat) == 0: # 用列表推导式生成,避免重复行引用的问题 Q_hat = np.array([[random.randint(1, 10) for _ in range(size)] for _ in range(size)]) # 验证:计算逆矩阵后相乘,结果应接近单位矩阵 P1 = np.linalg.inv(Q_hat) print("Q_hat:\n", Q_hat) print("Q_hat @ P1:\n", np.round(Q_hat @ P1, decimals=5)) # 四舍五入后为单位矩阵
方法2:直接构造可逆矩阵
如果不想碰随机生成可能不可逆的情况,可以直接构造比如上三角矩阵(只要对角线元素都不为0就可逆):
import numpy as np import random s = 5 size = s - 1 # 构造上三角矩阵,对角线元素取非零值,其他元素随机 Q_hat = np.triu([[random.randint(1, 10) for _ in range(size)] for _ in range(size)]) # 确保对角线非零 for i in range(size): if Q_hat[i][i] == 0: Q_hat[i][i] = random.randint(1, 10) # 验证 P1 = np.linalg.inv(Q_hat) print("Q_hat:\n", Q_hat) print("Q_hat @ P1:\n", np.round(Q_hat @ P1, decimals=5))
方法3:用numpy直接生成可逆矩阵
numpy的随机模块可以直接生成满秩矩阵(满秩等价于可逆),更高效:
import numpy as np s = 5 size = s - 1 # 生成随机浮点数满秩矩阵,肯定可逆 Q_hat = np.random.rand(size, size) # 如果需要整数矩阵,可以乘整数后取整,记得检查行列式避免极端情况 # Q_hat = np.round(np.random.rand(size, size)*10).astype(int) P1 = np.linalg.inv(Q_hat) print("Q_hat:\n", Q_hat) print("Q_hat @ P1:\n", np.round(Q_hat @ P1, decimals=5))
内容的提问来源于stack exchange,提问作者sakabukayo
相关产品推荐
相关产品推荐

