如何将多个“值”对应到单个键?(在矩阵对角化场景中)

2024-05-14 08:48:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一段代码(使用Python)来同时对两个交换矩阵a和B进行对角化,并希望创建一个字典来实现这一点。这里,“键”是特征值,“值”是特征向量(可能退化,也可能不退化)。这是我写的程序。然而,它不能给出所有具有共享特征值的特征向量。我想我需要在我的代码中修改一些东西来适应简并,但是我怎么能做到呢?谢谢

def simultaneous_eig(A, B):
epsilon = 10**-10
vals, vecs = la.eig(A)
degen = {}
for n in range(0,len(vals)):
    for m in range(0,n):
        #equality up to certain precision
        if np.abs(vals[m]-vals[n]) < epsilon:
            degen.get(vals[m], vecs[:,n])              
    degen[vals[n]] = np.array([vecs[:,n]])
return degen

Tags: 代码infor字典nprange矩阵特征值
2条回答

根据矩阵中值的大小,您可能使用了错误的“几乎相等”标准。例如,在比较标量时,根据您的标准,1E-20和1.1E-20将“几乎相等”,但1E20和1.1E20将不相等,即使相对误差相同

为什么不直接使用math.isclose

我在你的职能中发现了一些问题。首先,要实现您试图进行的递归比较,外循环应该从0到len(vals)-1,内循环应该从“n”到len(vals),如下面我更正的代码片段所示

此外,字典的“.get()”方法没有进行适当的修改。换句话说,您必须将输出分配给“if”子句中的变量(同样,请参见下面的更正代码)

最后,为了避免额外的单例维度,请避免在希望转换为numpy数组的变量周围放置“[]”

下面修改的函数应该可以解决您的问题。我无法完全测试它,所以如果仍然存在问题,请告诉我

快乐编码

def simultaneous_eig(A, B):
    epsilon = 10**-10
    vals, vecs = la.eig(A)
    degen = {}
    for n in range(0,len(vals)-1):
        for m in range(n+1,len(vals)):
            #equality up to certain precision
            if np.abs(vals[m]-vals[n]) < epsilon:
                vecs[:,n] = degen.get(vals[m])              
        degen[vals[n]] = np.array([vecs[:,n]])
    return degen

相关问题 更多 >

    热门问题