JuliaLang/LinearAlgebra.jl

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

开放

#1,050 创建于 2024年1月23日

 (15 条评论) (1 个反应) (0 位负责人)Julia (62 个派生)github user discovery
arraysgood first issue

仓库指标

星标
 (77 个星标)
PR 合并指标
 (平均合并 8天 17小时) (30 天内合并 5 个 PR)

描述

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.

贡献者指南