首页 > 解决方案 > 在 numpy 数组中迭代

问题描述

我有 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 循环,但我想不出一种方法来让它工作,我不确定这是否是最有效的方法。

标签: pythonpython-3.x

解决方案


此函数创建一个具有正特征值的数组:

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)),则创建一个新特征值。


推荐阅读