Юлия: У фактора в факторизации Холецкого нет поля? - PullRequest
0 голосов
/ 08 ноября 2018

Предположим, что у меня есть следующее

> 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.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 08 ноября 2018

В 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)

Как видите, два понятия, поля и свойства, могут быть ортогональными. В этом случае прямого перекрытия нет.

...