JuliaLang/LinearAlgebra.jl

[LinearAlgebra] `zero(::ArrayWrapper)` should forward to the parent

Ouverte

#1 050 ouverte le 23 janv. 2024

 (15 commentaires) (1 réaction) (0 personne assignée)Julia (62 forks)github user discovery
arraysgood first issue

Métriques du dépôt

Stars
 (77 étoiles)
Métriques de merge PR
 (Merge moyen 8j 17h) (5 PRs mergées en 30 j)

Description

So for the various array wrapper types like Symmetric, Hermitian, and Adjoint, we currently don't have a specialized zero method, but instead fall back to the AbstractArray definition which works in terms of similar. That means that e.g. this gives a MMatrix:

julia> using StaticArrays

julia> zero(Symmetric(SA[1 2; 3 4]))
2×2 Symmetric{Int64, MMatrix{2, 2, Int64, 4}} with indices SOneTo(2)×SOneTo(2):
 0  0
 0  0

I think though for these wrapper types, we should be able to define zero (and maybe some other functions?) like

for func in [:zero, #=Any others?=#]
    for Wrapper in [:Symmetric, :Hermitian, :Adjoint, #=Any others?=#]
       @eval Base.:($func)(M::$Wrapper) = $Wrapper($func(parent(M)))
    end
end

to avoid falling back to similar where possible, and make sure that custom methods like zero(::SMatrix) end up getting called instead.


Edit (May 18, 2026)

StaticArrays.jl has addressed some of these missing methods itself, and https://github.com/JuliaLang/LinearAlgebra.jl/pull/1592 addressed a subset of the missing methods, but I still think there's more.

struct TestWrap{T} <: AbstractMatrix{T}
    parent::Matrix{T}
end
Base.size(A::TestWrap) = size(A.parent)
Base.getindex(A::TestWrap, i, j) = A.parent[i,j]
Base.zero(A::TestWrap) = TestWrap(zero(A.parent))
  • zero(::Union{Hermitian, Symmetric}) https://github.com/JuliaLang/LinearAlgebra.jl/pull/1592
  • zero(::Union{Adjoint, Transpose, UpperTriangular, LowerTriangular, UnitUpperTriangular, UnitLowerTriangular, UpperHessenberg})
  • one(::Union{Hermitian, Symmetric, Adjoint, Transpose, UpperTriangular, LowerTriangular, UnitUpperTriangular, UnitLowerTriangular, UpperHessenberg})
  • copy(::Union{Hermitian, Symmetric, Adjoint, Transpose, UpperTriangular, LowerTriangular, UnitUpperTriangular, UnitLowerTriangular, UpperHessenberg})

There's probably more but those are the ones I could find so far. Please suggest more examples if you find them.

Guide contributeur