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)