You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现Francis双步QR算法时遇“解包值不足”错误求助

解决Francis双步QR算法中的"Not enough values to unpack"错误

错误原因

  1. 索引解包不匹配:报错行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两个变量,导致解包失败。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:16:45