实现Francis双步QR算法时遇“解包值不足”错误求助
解决Francis双步QR算法中的"Not enough values to unpack"错误
错误原因
- 索引解包不匹配:报错行
i, j = np.unravel_index(np.argmax(np.abs(H[k+1:, k])), (n - k - 1,))中,H[k+1:, k]是一维数组,np.argmax返回的是该一维数组的索引,np.unravel_index传入一维形状(n-k-1,)时只会返回单个值,却要赋值给i,j两个变量,导致解包失败。 - 2x2矩阵无报错的原因:当矩阵为2x2时,循环
range(n-2)等价于range(0),循环体完全不会执行,因此不会触发该行代码的错误。
修复方案
由于我们是在第k列的k+1行到末尾行范围内找最大元素,直接使用一维索引即可,无需np.unravel_index。修改报错行代码,去掉多余的j解包:
# 原错误代码 # i, j = np.unravel_index(np.argmax(np.abs(H[k+1:, k])), (n - k - 1,)) # 修改后的代码 i = np.argmax(np.abs(H[k+1:, k])) + k + 1
另外,你构造测试用Hessenberg矩阵的逻辑有误:Hessenberg矩阵要求次对角线以下元素为0(即i > j+1时H[i,j]=0),而非所有下三角元素为0。正确的构造方式应为:
H = np.copy(A) H[2, 0] = 0 # 仅次对角线以下的元素置0,次对角线H[2,1]保留原值
完整修复后的代码
import numpy as np def francis_double_step_qr(H): n = H.shape[0] Q = np.identity(n) for k in range(n - 2): # 找到第k列k+1行及以下的最大元素行索引 i = np.argmax(np.abs(H[k+1:, k])) + k + 1 # 计算Givens旋转 c, s = np.cos(H[i, k]), np.sin(H[i, k]) G = np.identity(n) G[k, k], G[i, i] = c, c G[k, i], G[i, k] = s, -s H = np.dot(G.T, np.dot(H, G)) Q = np.dot(Q, G) return H, Q A = np.array([[2, 3, 4], [5, 6, 7], [8, 9, 10]]) H = np.copy(A) H[2, 0] = 0 # 构造正确的Hessenberg矩阵 H, Q = francis_double_step_qr(H) print("Hessenberg Matrix after Francis Double Step QR:") print(H) print("Orthogonal Matrix Q:") print(Q)
内容的提问来源于stack exchange,提问作者Haris Bin Yousaf
相关产品推荐
相关产品推荐

