我正在编写一段代码(使用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
根据矩阵中值的大小,您可能使用了错误的“几乎相等”标准。例如,在比较标量时,根据您的标准,1E-20和1.1E-20将“几乎相等”,但1E20和1.1E20将不相等,即使相对误差相同
为什么不直接使用
math.isclose
我在你的职能中发现了一些问题。首先,要实现您试图进行的递归比较,外循环应该从0到len(vals)-1,内循环应该从“n”到len(vals),如下面我更正的代码片段所示
此外,字典的“.get()”方法没有进行适当的修改。换句话说,您必须将输出分配给“if”子句中的变量(同样,请参见下面的更正代码)
最后,为了避免额外的单例维度,请避免在希望转换为numpy数组的变量周围放置“[]”
下面修改的函数应该可以解决您的问题。我无法完全测试它,所以如果仍然存在问题,请告诉我
快乐编码
相关问题 更多 >
编程相关推荐