gpt4 book ai didi

matrix - cg 的 View 实现!在矩阵上

转载 作者:行者123 更新时间:2023-12-02 03:13:13 28 4
gpt4 key购买 nike

我正在尝试使用 cg!来自 IterativeSolvers.jl 的函数,用于求解矩阵-矩阵线性系统,即 AX=B 用于 A、X、B 适当大小的矩阵。鉴于索引的工作方式,X[:,i] 独立于除 B[:,i] 之外的所有内容,因此这实际上归结为 n 不同的线性求解。在这种情况下,通过 \ 直接求解会自动工作,但像 CG 这样的迭代求解器不会。我可以通过外部循环轻松地做到这一点,但我无法让就地操作正常工作。现在,我的代码如下所示:

for j=1:size(u,2)
u[freenode,j],ch = cg!(u[freenode,j],lhs,Dinv.*rhs(u,i)[:,j]) # Requires Vector, need to change rhs
end

用适当的左手边和右手边解决了 CG。但它不是就地的原因归结为这个抛出错误的简单示例:

using IterativeSolvers
y = view(ones(4,2),:,2)
A=rand(4,4)
cg!(y,A,view(zeros(4,2),:,2))

即:

ERROR: MethodError: no method matching init!
(::IterativeSolvers.KrylovSubspace{Float64,Array{Float64,2}}, ::SubArray{Float64,1,Array{Float64,2},Tuple{Colon,Int64},true})
Closest candidates are:
init!{T}(::IterativeSolvers.KrylovSubspace{T,OpT}, ::Array{T,1}) at C:\Users\Chris\.julia\v0.5\IterativeSolvers\src\krylov.jl:66
in #cg!#23 at C:\Users\Chris\.julia\v0.5\IterativeSolvers\src\cg.jl:7 [inlined]
in cg!(::SubArray{Float64,1,Array{Float64,2},Tuple{Colon,Int64},true}, ::Array{Float64,2}, ::SubArray{Float64,1,Array{Float64,2},Tuple{Colon,Int64},true}, ::Int64) at C:\Users\Chris\.julia\v0.5\IterativeSolvers\src\cg.jl:6 (repeats 2 times)

问题似乎与 View 无关,given the results of a previous SE question

最佳答案

我怀疑你能否避免分配,因为 init!功能实现为

function init!{T}(K::KrylovSubspace{T}, v::Vector{T})
# K.v = Vector{T}[all(v.==zero(T)) ? v : v/norm(v)]
K.v = Vector{T}[copy(v)]
end

因此无论如何都有一个副本。不过,如果您希望此函数接受 View ,只需将 Vector 修改为 AbstractVector 应该不是问题。 (功能比较简单,如果不喜欢修改包,自己加一个比较通用的方法即可。)

关于matrix - cg 的 View 实现!在矩阵上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38748412/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com