11""" `FillArrays` module to lazily represent matrices with a single value """
22module FillArrays
33
4- using LinearAlgebra, SparseArrays, Statistics
4+ using LinearAlgebra
55import Base: size, getindex, setindex!, IndexStyle, checkbounds, convert,
66 + , - , * , / , \ , diff, sum, cumsum, maximum, minimum, sort, sort!,
77 any, all, axes, isone, iterate, unique, allunique, permutedims, inv,
@@ -16,9 +16,6 @@ import LinearAlgebra: rank, svdvals!, tril, triu, tril!, triu!, diag, transpose,
1616
1717import Base. Broadcast: broadcasted, DefaultArrayStyle, broadcast_shape, BroadcastStyle, Broadcasted
1818
19- import Statistics: mean, std, var, cov, cor
20-
21-
2219export Zeros, Ones, Fill, Eye, Trues, Falses, OneElement
2320
2421import Base: oneto
@@ -530,6 +527,9 @@ function convert(::Type{T}, A::AbstractFillMatrix) where T<:Diagonal
530527 isdiag (A) ? T (A) : throw (InexactError (:convert , T, A))
531528end
532529
530+ Base. StepRangeLen (F:: AbstractFillVector{T} ) where T = StepRangeLen (getindex_value (F), zero (T), length (F))
531+ convert (:: Type{SL} , F:: AbstractFillVector ) where SL<: AbstractRange = convert (SL, StepRangeLen (F))
532+
533533# ################
534534# Structured matrix types
535535# ################
@@ -542,52 +542,6 @@ for SMT in (:Diagonal, :Bidiagonal, :Tridiagonal, :SymTridiagonal)
542542 end
543543end
544544
545- # #################
546- # # Sparse arrays
547- # #################
548- SparseVector {T} (Z:: ZerosVector ) where T = spzeros (T, length (Z))
549- SparseVector {Tv,Ti} (Z:: ZerosVector ) where {Tv,Ti} = spzeros (Tv, Ti, length (Z))
550-
551- convert (:: Type{AbstractSparseVector} , Z:: ZerosVector{T} ) where T = spzeros (T, length (Z))
552- convert (:: Type{AbstractSparseVector{T}} , Z:: ZerosVector ) where T= spzeros (T, length (Z))
553-
554- SparseMatrixCSC {T} (Z:: ZerosMatrix ) where T = spzeros (T, size (Z)... )
555- SparseMatrixCSC {Tv,Ti} (Z:: Zeros{T,2,Axes} ) where {Tv,Ti<: Integer ,T,Axes} = spzeros (Tv, Ti, size (Z)... )
556-
557- convert (:: Type{AbstractSparseMatrix} , Z:: ZerosMatrix{T} ) where T = spzeros (T, size (Z)... )
558- convert (:: Type{AbstractSparseMatrix{T}} , Z:: ZerosMatrix ) where T = spzeros (T, size (Z)... )
559-
560- convert (:: Type{AbstractSparseArray} , Z:: Zeros{T} ) where T = spzeros (T, size (Z)... )
561- convert (:: Type{AbstractSparseArray{Tv}} , Z:: Zeros{T} ) where {T,Tv} = spzeros (Tv, size (Z)... )
562- convert (:: Type{AbstractSparseArray{Tv,Ti}} , Z:: Zeros{T} ) where {T,Tv,Ti} = spzeros (Tv, Ti, size (Z)... )
563- convert (:: Type{AbstractSparseArray{Tv,Ti,N}} , Z:: Zeros{T,N} ) where {T,Tv,Ti,N} = spzeros (Tv, Ti, size (Z)... )
564-
565- SparseMatrixCSC {Tv} (Z:: Eye{T} ) where {T,Tv} = SparseMatrixCSC {Tv} (I, size (Z)... )
566- # works around missing `speye`:
567- SparseMatrixCSC {Tv,Ti} (Z:: Eye{T} ) where {T,Tv,Ti<: Integer } =
568- convert (SparseMatrixCSC{Tv,Ti}, SparseMatrixCSC {Tv} (I, size (Z)... ))
569-
570- convert (:: Type{AbstractSparseMatrix} , Z:: Eye{T} ) where {T} = SparseMatrixCSC {T} (I, size (Z)... )
571- convert (:: Type{AbstractSparseMatrix{Tv}} , Z:: Eye{T} ) where {T,Tv} = SparseMatrixCSC {Tv} (I, size (Z)... )
572-
573- convert (:: Type{AbstractSparseArray} , Z:: Eye{T} ) where T = SparseMatrixCSC {T} (I, size (Z)... )
574- convert (:: Type{AbstractSparseArray{Tv}} , Z:: Eye{T} ) where {T,Tv} = SparseMatrixCSC {Tv} (I, size (Z)... )
575-
576-
577- convert (:: Type{AbstractSparseArray{Tv,Ti}} , Z:: Eye{T} ) where {T,Tv,Ti} =
578- convert (SparseMatrixCSC{Tv,Ti}, Z)
579- convert (:: Type{AbstractSparseArray{Tv,Ti,2}} , Z:: Eye{T} ) where {T,Tv,Ti} =
580- convert (SparseMatrixCSC{Tv,Ti}, Z)
581-
582- function SparseMatrixCSC {Tv} (R:: RectOrDiagonalFill ) where {Tv}
583- SparseMatrixCSC {Tv,eltype(axes(R,1))} (R)
584- end
585- function SparseMatrixCSC {Tv,Ti} (R:: RectOrDiagonalFill ) where {Tv,Ti}
586- Base. require_one_based_indexing (R)
587- v = parent (R)
588- J = getindex_value (v)* I
589- SparseMatrixCSC {Tv,Ti} (J, size (R))
590- end
591545
592546# ########
593547# maximum/minimum
@@ -698,35 +652,6 @@ function in(x, A::RectDiagonal{<:Number})
698652 x == zero (eltype (A)) || x in A. diag
699653end
700654
701- # ########
702- # mean, std
703- # ########
704-
705- mean (A:: AbstractFill ; dims= (:)) = mean (identity, A; dims= dims)
706- function mean (f:: Union{Function, Type} , A:: AbstractFill ; dims= (:))
707- val = float (f (getindex_value (A)))
708- dims isa Colon ? val :
709- Fill (val, ntuple (d -> d in dims ? 1 : size (A,d), ndims (A))... )
710- end
711-
712-
713- function var (A:: AbstractFill{T} ; corrected:: Bool = true , mean= nothing , dims= (:)) where {T<: Number }
714- dims isa Colon ? zero (float (T)) :
715- Zeros {float(T)} (ntuple (d -> d in dims ? 1 : size (A,d), ndims (A))... )
716- end
717-
718- cov (A:: AbstractFillVector{T} ; corrected:: Bool = true ) where {T<: Number } = zero (float (T))
719- cov (A:: AbstractFillMatrix{T} ; corrected:: Bool = true , dims:: Integer = 1 ) where {T<: Number } =
720- Zeros {float(T)} (size (A, 3 - dims), size (A, 3 - dims))
721-
722- cor (A:: AbstractFillVector{T} ) where {T<: Number } = one (float (T))
723- function cor (A:: AbstractFillMatrix{T} ; dims:: Integer = 1 ) where {T<: Number }
724- out = fill (float (T)(NaN ), size (A, 3 - dims), size (A, 3 - dims))
725- out[LinearAlgebra. diagind (out)] .= 1
726- out
727- end
728-
729-
730655# ########
731656# include
732657# ########
@@ -735,6 +660,11 @@ include("fillalgebra.jl")
735660include (" fillbroadcast.jl" )
736661include (" trues.jl" )
737662
663+ @static if ! isdefined (Base, :get_extension )
664+ include (" ../ext/FillArraysSparseArraysExt.jl" )
665+ include (" ../ext/FillArraysStatisticsExt.jl" )
666+ end
667+
738668# #
739669# print
740670# #
@@ -781,11 +711,19 @@ function Base.show(io::IO, ::MIME"text/plain", x::Union{Eye, AbstractFill})
781711end
782712
783713function Base. show (io:: IO , x:: AbstractFill ) # for example (Fill(π,3),)
784- print (io, nameof (typeof (x)), " (" )
785- if x isa Union{Zeros, Ones}
714+ print (io, nameof (typeof (x)))
715+ sz = size (x)
716+ args = if x isa Union{Zeros, Ones}
717+ T = eltype (x)
718+ if T != Float64
719+ print (io," {" , T, " }" )
720+ end
721+ print (io, " (" )
786722 else
787- show (io, getindex_value (x)) # show not print to handle (Fill(1f0,2),)
788- ndims (x) > 0 && print (io, " , " )
723+ # show, not print, to handle (Fill(1f0,2),)
724+ print (io, " (" )
725+ show (io, getindex_value (x))
726+ ndims (x) == 0 || print (io, " , " )
789727 end
790728 join (io, size (x), " , " )
791729 print (io, " )" )
0 commit comments