Skip to content

Commit 552faa7

Browse files
authored
Support Diagonal matrices of Fills (#98)
* Support diagonal matrix of eltype Fill or Zeros * v0.8.9
1 parent 5dc045a commit 552faa7

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "FillArrays"
22
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
3-
version = "0.8.8"
3+
version = "0.8.9"
44

55
[deps]
66
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

src/FillArrays.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Base: size, getindex, setindex!, IndexStyle, checkbounds, convert,
77
copy, vec, setindex!, count, ==, reshape, _throw_dmrs, map, zero
88

99
import LinearAlgebra: rank, svdvals!, tril, triu, tril!, triu!, diag, transpose, adjoint, fill!,
10-
norm2, norm1, normInf, normMinusInf, normp, lmul!, rmul!
10+
norm2, norm1, normInf, normMinusInf, normp, lmul!, rmul!, diagzero
1111

1212
import Base.Broadcast: broadcasted, DefaultArrayStyle, broadcast_shape
1313

@@ -186,7 +186,9 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one))
186186
@eval begin
187187
struct $Typ{T, N, Axes} <: AbstractFill{T, N, Axes}
188188
axes::Axes
189-
@inline $Typ{T, N}(sz::Axes) where Axes<:Tuple{Vararg{AbstractUnitRange,N}} where {T, N} =
189+
@inline $Typ{T,N,Axes}(sz::Axes) where Axes<:Tuple{Vararg{AbstractUnitRange,N}} where {T, N} =
190+
new{T,N,Axes}(sz)
191+
@inline $Typ{T,N}(sz::Axes) where Axes<:Tuple{Vararg{AbstractUnitRange,N}} where {T, N} =
190192
new{T,N,Axes}(sz)
191193
@inline $Typ{T,0,Tuple{}}(sz::Tuple{}) where T = new{T,0,Tuple{}}(sz)
192194
end

src/fillalgebra.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,4 +231,10 @@ function rmul!(z::AbstractFill, x::Number)
231231
# for, e.g., lmul!(NaN, z)
232232
λ*x == λ || throw(ArgumentError("Cannot scale by $x"))
233233
z
234-
end
234+
end
235+
236+
fillzero(::Type{Fill{T,N,AXIS}}, n, m) where {T,N,AXIS} = Fill{T,N,AXIS}(zero(T), (n, m))
237+
fillzero(::Type{Zeros{T,N,AXIS}}, n, m) where {T,N,AXIS} = Zeros{T,N,AXIS}((n, m))
238+
fillzero(::Type{F}, n, m) where F = throw(ArgumentError("Cannot create a zero array of type $F"))
239+
240+
diagzero(D::Diagonal{F}, i, j) where F<:AbstractFill = fillzero(F, axes(D.diag[i], 1), axes(D.diag[j], 2))

test/runtests.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -965,4 +965,19 @@ end
965965
@test rmul!(x,1.0) === x
966966
@test_throws ArgumentError lmul!(2.0,x)
967967
@test_throws ArgumentError rmul!(x,2.0)
968+
end
969+
970+
@testset "Diagonal{<:Fill}" begin
971+
D = Diagonal(Fill(Fill(0.5,2,2),10))
972+
@test @inferred(D[1,1]) === Fill(0.5,2,2)
973+
@test @inferred(D[1,2]) === Fill(0.0,2,2)
974+
D = Diagonal(Fill(Zeros(2,2),10))
975+
@test @inferred(D[1,1]) === Zeros(2,2)
976+
@test @inferred(D[1,2]) === Zeros(2,2)
977+
978+
D = Diagonal([Zeros(1,1), Zeros(2,2)])
979+
@test @inferred(D[1,1]) === Zeros(1,1)
980+
@test @inferred(D[1,2]) === Zeros(1,2)
981+
982+
@test_throws ArgumentError Diagonal(Fill(Ones(2,2),10))[1,2]
968983
end

0 commit comments

Comments
 (0)