我有 3 个 2x2 矩阵:P1、P2 和 P3,它们填充有随机生成的整数。我想确保这些矩阵是正定的(即所有特征值都大于 0)。我的代码如下。
P1 = np.random.randint(10, size=(m,n))
P2 = np.random.randint(10, size=(m,n))
P3 = np.random.randint(10, size=(m,n))
lambda1 = np.linalg.eigvals(P1)
lambda2 = np.linalg.eigvals(P2)
lambda3 = np.linalg.eigvals(P3)
for i in lambda1:
if (i <= 0): P1 = np.random.randint(10, size=(m,n))
for i in lambda2:
if (i <= 0): P2 = np.random.randint(10, size=(m,n))
for i in lambda3:
if (i <= 0): P3 = np.random.randint(10, size=(m,n))
print('Eigenvalue output to to verify that matrices are positive definite:\n')
print(u'\u03BB(P\u2081) = ' + str(np.linalg.eigvals(P1)))
print(u'\u03BB(P\u2082) = ' + str(np.linalg.eigvals(P2)))
print(u'\u03BB(P\u2083) = ' + str(np.linalg.eigvals(P3)))
现在,如果特征值不为正,if 语句几乎会重新生成矩阵一次或两次,但它不会验证特征值是否始终为正。我的第一个猜测是在 for 循环中嵌套一个 while 循环,但我无法找到一种方法来让它工作,而且我不确定这是否是最有效的方法。
最佳答案
此函数创建一个具有正特征值的数组:
def create_arr_with_pos_ev(m,n):
ev = np.array([-1,-1])
while not all(ev>0):
arr = np.random.randint(10, size=(m,n))
ev = np.linalg.eigvals(arr)
return arr, ev
首先,我定义低于 0 的虚拟特征值。然后创建一个新数组并计算其特征值。如果存在负特征值(while not all(ev>0)
),则创建一个新特征值。
关于python - 在 numpy 数组中迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53134082/