如何用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
相关产品推荐
相关产品推荐

