Julia 朱莉娅:Cholesky分解中的U因子不是一个域吗?
假设我有以下几点Julia 朱莉娅:Cholesky分解中的U因子不是一个域吗?,julia,linear-algebra,Julia,Linear Algebra,假设我有以下几点 > L = [5 1; 1 3] > chol = LinearAlgebra.cholesky(L) LinearAlgebra.Cholesky{Float64,Array{Float64,2}} U factor: 2×2 LinearAlgebra.UpperTriangular{Float64,Array{Float64,2}}: 2.23607 0.447214 ⋅ 1.67332 我想访问矩阵,更具体地说,对矩阵进行切片,得到第
> L = [5 1; 1 3]
> chol = LinearAlgebra.cholesky(L)
LinearAlgebra.Cholesky{Float64,Array{Float64,2}}
U factor:
2×2 LinearAlgebra.UpperTriangular{Float64,Array{Float64,2}}:
2.23607 0.447214
⋅ 1.67332
我想访问矩阵,更具体地说,对矩阵进行切片,得到第一行、第二行等,这样我就可以像这样访问因子U
> chol.U
2×2 LinearAlgebra.UpperTriangular{Float64,Array{Float64,2}}:
2.23607 0.447214
⋅ 1.67332
我的问题是:.U
到底代表什么?如果我尝试getfield(chol,:U)
我会得到一个错误,因为没有字段:U
,实际上,字段名(linearagebra.Cholesky)
返回:factors
,:uplo
和:info
我在这里遗漏了什么?在Julia 1.0中,点语法
x.s
是getproperty(x,s)
的缩写,就像x[idx]
映射到getindex(x,idx)
。因此,您可以让它以您想要的任何方式运行。只有通用默认值等同于允许您访问对象的字段。要查看为类型为Cholesky
的对象调用的特定方法,可以使用@如下所示:
julia> @which chol.U
getproperty(C::Cholesky, d::Symbol) in LinearAlgebra at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.0\LinearAlgebra\src\cholesky.jl:339
如果检查中的源代码,您会发现以下内容:
function getproperty(C::Cholesky, d::Symbol)
Cfactors = getfield(C, :factors)
Cuplo = getfield(C, :uplo)
info = getfield(C, :info)
if d == :U
return UpperTriangular(Cuplo === char_uplo(d) ? Cfactors : copy(Cfactors'))
elseif d == :L
return LowerTriangular(Cuplo === char_uplo(d) ? Cfactors : copy(Cfactors'))
elseif d == :UL
return (Cuplo === 'U' ? UpperTriangular(Cfactors) : LowerTriangular(Cfactors))
else
return getfield(C, d)
end
end
我们看到在d==:U
的情况下,它没有映射到类似getfield(C,d)
的东西,而是以某种方式构造了一个上三角矩阵。只有对于某些通用符号d
,方法才会映射到getfield(C,d)
最后,字段的fieldnames
挂件是属性的propertynames
(您可以在x.s
中为s
编写的内容):
如您所见,字段和属性这两个概念可以是正交的。在这种情况下,没有直接的重叠。嗯,我明白了。。我以前从未遇到过财产的概念。属性是否仅通过getproperty
方法定义?这是否意味着属性不在任何地方“存在”(与位于结构中的字段相反)?它们是通过propertynames
、getproperty
和setproperty定义的代码>。是的,如果你愿意的话,它们不会“存在”任何地方。但是,一般来说,它们与字段有100%的重叠。
julia> propertynames(chol)
(:U, :L, :UL)
julia> fieldnames(typeof(chol))
(:factors, :uplo, :info)