Skip to content

Inconsistent handling of one and zero for special matrix types. #170

Closed
@jakebolewski

Description

@jakebolewski

Sometimes one or zero returns a dense matrix, other times a special matrix type. one and zero are not defined for all major special matrix types in LinAlg.

Ex.

julia> A = randn(5,5)
5x5 Array{Float64,2}:
 -0.584781  -0.200855   0.622116   -0.217739     1.1236
  0.134056  -0.136507   2.14805    -0.43222     -1.26277
  0.459692  -0.665234   2.2665     -3.7361      -1.85841
  0.561744  -1.54699    0.0842729  -0.00529171  -0.258032
 -0.108674  -0.538445  -0.290112   -1.05528      0.496317

julia> SymA = A*A'/2
5x5 Array{Float64,2}:
  1.03961      -0.0196852   0.000103685  -0.12706    0.389328
 -0.0196852     3.21606     4.49128       0.397812  -0.367431
  0.000103685   4.49128    11.6015        0.988823   1.33548
 -0.12706       0.397812    0.988823      1.39123    0.312497
  0.389328     -0.367431    1.33548       0.312497   0.872922

julia> BD = Bidiagonal(A, true)
5x5 Base.LinAlg.Bidiagonal{Float64}:
 -0.584781  -0.200855  0.0       0.0          0.0
  0.0       -0.136507  2.14805   0.0          0.0
  0.0        0.0       2.2665   -3.7361       0.0
  0.0        0.0       0.0      -0.00529171  -0.258032
  0.0        0.0       0.0       0.0          0.496317

julia> one(BD)
5x5 Array{Float64,2}:
 1.0  0.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0  0.0
 0.0  0.0  1.0  0.0  0.0
 0.0  0.0  0.0  1.0  0.0
 0.0  0.0  0.0  0.0  1.0

julia> zero(BD)
ERROR: MethodError: `similar` has no method matching similar(::Base.LinAlg.Bidiagonal{Float64}, ::Type{Float64}, ::(Int64,Int64))
Closest candidates are:
  similar(::Range{T}, ::Type{T<:Top}, ::(Int64...,))
  similar(::Range{T}, ::Type{T<:Top}, ::(Integer...,))
  similar(::SubArray{T,N,P<:AbstractArray{T,N},I<:(Union(Array{Int64,1},Colon,Int64,Range{Int64})...,),LD}, ::Any, ::(Int64...,))
  ...

 in zero at abstractarray.jl:298

julia> D = Diagonal(A)
5x5 Base.LinAlg.Diagonal{Float64}:
 -0.584781   0.0       0.0      0.0         0.0
  0.0       -0.136507  0.0      0.0         0.0
  0.0        0.0       2.2665   0.0         0.0
  0.0        0.0       0.0     -0.00529171  0.0
  0.0        0.0       0.0      0.0         0.496317

julia> one(D)
5x5 Array{Float64,2}:
 1.0  0.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0  0.0
 0.0  0.0  1.0  0.0  0.0
 0.0  0.0  0.0  1.0  0.0
 0.0  0.0  0.0  0.0  1.0

julia> zero(D)
5x5 Base.LinAlg.Diagonal{Float64}:
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0

julia> S = Symmetric(SymA)
5x5 Base.LinAlg.Symmetric{Float64,Array{Float64,2}}:
  1.03961      -0.0196852   0.000103685  -0.12706    0.389328
 -0.0196852     3.21606     4.49128       0.397812  -0.367431
  0.000103685   4.49128    11.6015        0.988823   1.33548
 -0.12706       0.397812    0.988823      1.39123    0.312497
  0.389328     -0.367431    1.33548       0.312497   0.872922

julia> one(S)
5x5 Array{Float64,2}:
 1.0  0.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0  0.0
 0.0  0.0  1.0  0.0  0.0
 0.0  0.0  0.0  1.0  0.0
 0.0  0.0  0.0  0.0  1.0

julia> zero(S)
ERROR: MethodError: `similar` has no method matching similar(::Base.LinAlg.Symmetric{Float64,Array{Float64,2}}, ::Type{Float64}, ::(Int64,Int64))
Closest candidates are:
  similar(::Range{T}, ::Type{T<:Top}, ::(Int64...,))
  similar(::Range{T}, ::Type{T<:Top}, ::(Integer...,))
  similar(::SubArray{T,N,P<:AbstractArray{T,N},I<:(Union(Array{Int64,1},Colon,Int64,Range{Int64})...,),LD}, ::Any, ::(Int64...,))
  ...

 in zero at abstractarray.jl:298

julia> H = Hermitian(SymA)
5x5 Base.LinAlg.Hermitian{Float64,Array{Float64,2}}:
  1.03961      -0.0196852   0.000103685  -0.12706    0.389328
 -0.0196852     3.21606     4.49128       0.397812  -0.367431
  0.000103685   4.49128    11.6015        0.988823   1.33548
 -0.12706       0.397812    0.988823      1.39123    0.312497
  0.389328     -0.367431    1.33548       0.312497   0.872922

julia> one(H)
5x5 Array{Float64,2}:
 1.0  0.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0  0.0
 0.0  0.0  1.0  0.0  0.0
 0.0  0.0  0.0  1.0  0.0
 0.0  0.0  0.0  0.0  1.0

julia> zero(H)
ERROR: MethodError: `similar` has no method matching similar(::Base.LinAlg.Hermitian{Float64,Array{Float64,2}}, ::Type{Float64}, ::(Int64,Int64))
Closest candidates are:
  similar(::Range{T}, ::Type{T<:Top}, ::(Int64...,))
  similar(::Range{T}, ::Type{T<:Top}, ::(Integer...,))
  similar(::SubArray{T,N,P<:AbstractArray{T,N},I<:(Union(Array{Int64,1},Colon,Int64,Range{Int64})...,),LD}, ::Any, ::(Int64...,))
  ...

 in zero at abstractarray.jl:298

julia> UT = UpperTriangular(A)
5x5 Base.LinAlg.UpperTriangular{Float64,Array{Float64,2}}:
 -0.584781  -0.200855  0.622116  -0.217739     1.1236
  0.0       -0.136507  2.14805   -0.43222     -1.26277
  0.0        0.0       2.2665    -3.7361      -1.85841
  0.0        0.0       0.0       -0.00529171  -0.258032
  0.0        0.0       0.0        0.0          0.496317

julia> one(UT)
5x5 Array{Float64,2}:
 1.0  0.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0  0.0
 0.0  0.0  1.0  0.0  0.0
 0.0  0.0  0.0  1.0  0.0
 0.0  0.0  0.0  0.0  1.0

julia> zero(UT)
5x5 Base.LinAlg.UpperTriangular{Float64,Array{Float64,2}}:
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0

julia> ST = SymTridiagonal(SymA)
5x5 Base.LinAlg.SymTridiagonal{Float64}:
  1.03961    -0.0196852   0.0       0.0       0.0
 -0.0196852   3.21606     4.49128   0.0       0.0
  0.0         4.49128    11.6015    0.988823  0.0
  0.0         0.0         0.988823  1.39123   0.312497
  0.0         0.0         0.0       0.312497  0.872922

julia> one(ST)
5x5 Array{Float64,2}:
 1.0  0.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0  0.0
 0.0  0.0  1.0  0.0  0.0
 0.0  0.0  0.0  1.0  0.0
 0.0  0.0  0.0  0.0  1.0

julia> zero(ST)
ERROR: MethodError: `similar` has no method matching similar(::Base.LinAlg.SymTridiagonal{Float64}, ::Type{Float64}, ::(Int64,Int64))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions