Python 在scipy.sparse.linalg.cg中打印回调中的当前剩余值
我正在使用Python 在scipy.sparse.linalg.cg中打印回调中的当前剩余值,python,scipy,linear-algebra,Python,Scipy,Linear Algebra,我正在使用scipy.sparse.linalg.cg来求解一个大型稀疏线性系统,它工作得很好,只是我想添加一个进度报告,以便在解算器工作时可以监控残差。我已经设置了一个回调,但是我不知道如何从回调中访问当前的剩余值。当然,自己计算残差是可能的,但这是一个相当繁重的操作,我希望避免。我是否遗漏了一些内容,或者没有有效的方法获取剩余内容?回调只发送xk,即当前解决方案向量。因此,您无法直接访问剩余的。但是,showsresid是cg函数中的局部变量 因此,使用CPython,可以使用inspect
scipy.sparse.linalg.cg
来求解一个大型稀疏线性系统,它工作得很好,只是我想添加一个进度报告,以便在解算器工作时可以监控残差。我已经设置了一个回调,但是我不知道如何从回调中访问当前的剩余值。当然,自己计算残差是可能的,但这是一个相当繁重的操作,我希望避免。我是否遗漏了一些内容,或者没有有效的方法获取剩余内容?回调只发送xk
,即当前解决方案向量。因此,您无法直接访问剩余的。但是,showsresid
是cg
函数中的局部变量
因此,使用CPython,可以使用inspect
模块查看调用者框架中的局部变量:
import inspect
import numpy as np
import scipy as sp
import scipy.sparse as sparse
import scipy.sparse.linalg as splinalg
import random
def report(xk):
frame = inspect.currentframe().f_back
print(frame.f_locals['resid'])
N = 200
A = sparse.lil_matrix( (N, N) )
for _ in xrange(N):
A[random.randint(0, N-1), random.randint(0, N-1)] = random.randint(1, 100)
b = np.random.randint(0, N-1, size = N)
x, info = splinalg.cg(A, b, callback = report)
谢谢,成功了。奇怪的是,像这样的黑客是必要的,虽然。访问残差是CG回调中最常见的一件事。