朱莉娅:霍夫斯基分解中的U因子不是一个字段?

时间:2018-11-08 16:05:28

标签: 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

我想访问矩阵,更具体地说是对矩阵进行切片并获得第一行,第二行等,因此我可以像这样访问因子U

> chol.U
2×2 LinearAlgebra.UpperTriangular{Float64,Array{Float64,2}}:
 2.23607  0.447214
  ⋅       1.67332

我的问题是:.U到底代表什么?如果我尝试getfield(chol, :U)会收到错误消息,因为没有字段:U,实际上fieldnames(LinearAlgebra.Cholesky)返回:factors:uplo:info。 / p>

我在这里想念什么?

1 个答案:

答案 0 :(得分:2)

在Julia 1.0中,点语法x.sgetproperty(x, :s)的简写,就像x[idx]映射到getindex(x, idx)一样。因此,您可以使它以任何所需的方式运行。仅通用默认值等效于允许您访问对象的字段。要查看为Cholesky类型的对象所调用的特定方法,可以按如下方式使用@which

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

如果您在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)之类的东西,而是以某种方式构造了一个UpperTriangular矩阵。该方法仅对某些通用符号d映射到getfield(C, d)

最后,字段的fieldnames的垂饰是属性的propertynames(您可以在s中为x.s编写的内容):

julia> propertynames(chol)
(:U, :L, :UL)

julia> fieldnames(typeof(chol))
(:factors, :uplo, :info)

如您所见,字段和属性这两个概念可以正交。在这种情况下,没有直接重叠。