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

如何用Numpy将Arnoldi方法的双层循环实现简化为单层循环?

单层循环的Arnoldi算法实现

要将双层循环的Arnoldi算法简化为单层循环,核心是利用矩阵批量运算替换逐列的正交化操作,避免内层循环。以下是修改后的实现:

import numpy as np
from numpy.linalg import norm

def arnoldi_single_loop(A, b, k):
    """
    对矩阵A执行k次Arnoldi迭代,以b作为初始基向量。
    
    :return Q: mx(k+1)维NumPy数组,包含正交规范基
    :return H: (k+1)xk维NumPy数组,包含上Hessenberg矩阵
    """
    m = len(A)
    Q = np.zeros((m, k + 1), dtype=complex)
    H = np.zeros((k + 1, k), dtype=complex)
    Q[:, 0] = b / norm(b)
    
    for i in range(k):
        v = A @ Q[:, i]
        # 批量计算前i+1个基向量与v的内积,替换内层循环
        H[:i+1, i] = np.conj(Q[:, :i+1].T) @ v
        # 批量减去v在已生成基上的投影
        v -= Q[:, :i+1] @ H[:i+1, i]
        # 完成剩余步骤
        H[i+1, i] = norm(v)
        Q[:, i+1] = v / norm(v)
    
    return Q, H

关键修改说明

  • 用np.conj(Q[:, :i+1].T) @ v一次性计算所有前i+1个正交基与v的内积,结果直接存入H的第i列前i+1行,替代原内层循环的逐次计算。
  • 用Q[:, :i+1] @ H[:i+1, i]一次性计算v在所有已生成基上的投影总和,再从v中减去,替代原内层循环的逐次投影减法。
  • 其余步骤与原代码逻辑完全一致,保证结果正确性。

内容的提问来源于stack exchange,提问作者laikaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:31:02