假设我有以下内容
> 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>
我在这里想念什么?
答案 0 :(得分:2)
在Julia 1.0中,点语法x.s
是getproperty(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)
如您所见,字段和属性这两个概念可以正交。在这种情况下,没有直接重叠。