Skip to content

Commit 9117b33

Browse files
authored
QuasiFill (#63)
* Start QuasiFill * Fix bugs * add fill algebra and broadcasting * more tests * more tests pass * tests pass * Update test_quasifill.jl * fix stack overflow * ones, zeros, one, zero, fill * StaticArray indexing * Support hcat with quasivec and quasimat * Update test_quasifill.jl * union cardinality * Update quasifill.jl
1 parent 5a9a33c commit 9117b33

15 files changed

+1287
-29
lines changed

Project.toml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
name = "QuasiArrays"
22
uuid = "c4ea9172-b204-11e9-377d-29865faadc5c"
33
authors = ["Sheehan Olver <solver@mac.com>"]
4-
version = "0.4.10"
4+
version = "0.5.0"
55

66
[deps]
77
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
88
DomainSets = "5b8099bc-c8ec-5219-889f-1d9e522a28bf"
9+
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
910
LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02"
1011
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
12+
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
1113

1214
[compat]
1315
ArrayLayouts = "0.5, 0.6"
1416
DomainSets = "0.4"
17+
FillArrays = "0.11"
1518
LazyArrays = "0.20, 0.21"
19+
StaticArrays = "1"
1620
julia = "1.5"
1721

1822
[extras]
1923
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
2024
IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
25+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
2126
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
2227

2328
[targets]
24-
test = ["Base64", "Test", "IntervalSets"]
29+
test = ["Base64", "IntervalSets", "Random", "Test"]

src/QuasiArrays.jl

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module QuasiArrays
2-
using Base, LinearAlgebra, LazyArrays, ArrayLayouts, DomainSets
2+
using Base, LinearAlgebra, LazyArrays, ArrayLayouts, DomainSets, FillArrays, StaticArrays
33
import Base: getindex, size, axes, axes1, length, ==, isequal, iterate, CartesianIndices, LinearIndices,
44
Indices, IndexStyle, getindex, setindex!, parent, vec, convert, similar, copy, copyto!, zero,
55
map, eachindex, eltype, first, last, firstindex, lastindex, in, reshape, permutedims, all,
@@ -8,7 +8,7 @@ import Base: @_inline_meta, DimOrInd, OneTo, @_propagate_inbounds_meta, @_noinli
88
DimsInteger, error_if_canonical_getindex, @propagate_inbounds, _return_type,
99
_maybetail, tail, _getindex, _maybe_reshape, index_ndims, _unsafe_getindex,
1010
index_shape, to_shape, unsafe_length, @nloops, @ncall, unalias, _unaliascopy,
11-
to_index, to_indices, _to_subscript_indices, _splatmap, dataids,
11+
to_index, to_indices, _to_subscript_indices, _splatmap, dataids,
1212
compute_stride1, compute_offset1, fill_to_length
1313
import Base: Slice, IdentityUnitRange, ScalarIndex, RangeIndex, view, viewindexing, mightalias, ensure_indexable, index_dimsum,
1414
check_parent_index_match, reindex, _isdisjoint, unsafe_indices, _unsafe_ind2sub,
@@ -24,19 +24,22 @@ import Base: exp, log, sqrt,
2424
acos, asin, atan, acsc, asec, acot,
2525
acosh, asinh, atanh, acsch, asech, acoth
2626
import Base: Array, Matrix, Vector
27-
import Base: union, intersect
27+
import Base: union, intersect, sort, sort!
28+
import Base: conj, real, imag
29+
import Base: sum, cumsum, diff
30+
import Base: ones, zeros, one, zero, fill
2831

2932
import Base.Broadcast: materialize, materialize!, BroadcastStyle, AbstractArrayStyle, Style, broadcasted, Broadcasted, Unknown,
30-
newindex, broadcastable, preprocess, _eachindex, _broadcast_getindex,
31-
DefaultArrayStyle, axistype, throwdm, instantiate, combine_eltypes, eltypes
33+
newindex, broadcastable, preprocess, _eachindex, _broadcast_getindex, broadcast_shape,
34+
DefaultArrayStyle, axistype, throwdm, instantiate, combine_eltypes, eltypes
3235

3336
import LinearAlgebra: transpose, adjoint, checkeltype_adjoint, checkeltype_transpose, Diagonal,
3437
AbstractTriangular, pinv, inv, promote_leaf_eltypes, power_by_squaring,
35-
integerpow, schurpow, tr, factorize, copy_oftype
38+
integerpow, schurpow, tr, factorize, copy_oftype, rank
3639

37-
import ArrayLayouts: indextype, concretize
40+
import ArrayLayouts: indextype, concretize, fillzeros, OnesLayout, AbstractFillLayout, FillLayout, ZerosLayout
3841
import LazyArrays: MemoryLayout, UnknownLayout, Mul, ApplyLayout, BroadcastLayout,
39-
InvOrPInv, ApplyStyle, AbstractLazyLayout, LazyLayout,
42+
InvOrPInv, ApplyStyle, AbstractLazyLayout, LazyLayout,
4043
MulStyle, MulAddStyle, LazyArrayApplyStyle, combine_mul_styles, DefaultArrayApplyStyle,
4144
Applied, flatten, _flatten, arguments, _mat_mul_arguments, _vec_mul_arguments, _mul_arguments,
4245
rowsupport, colsupport, tuple_type_memorylayouts, applylayout, broadcastlayout,
@@ -50,7 +53,7 @@ export AbstractQuasiArray, AbstractQuasiMatrix, AbstractQuasiVector, materialize
5053
QuasiArray, QuasiMatrix, QuasiVector, QuasiDiagonal, Inclusion,
5154
QuasiAdjoint, QuasiTranspose, ApplyQuasiArray, ApplyQuasiMatrix, ApplyQuasiVector,
5255
BroadcastQuasiArray, BroadcastQuasiMatrix, BroadcastQuasiVector, indextype,
53-
QuasiKron, quasikron, UnionVcat, SubQuasiArray
56+
QuasiKron, quasikron, UnionVcat, SubQuasiArray, QuasiFill, QuasiZeros, QuasiOnes, QuasiEye
5457

5558
import Base.Broadcast: broadcast_preserving_zero_d
5659

@@ -70,6 +73,7 @@ const AbstractQuasiOrArray{T} = Union{AbstractArray{T},AbstractQuasiArray{T}}
7073

7174

7275
cardinality(d) = length(d)
76+
cardinality(d::UnionDomain) = +(cardinality.(d.domains)...)
7377

7478
size(A::AbstractQuasiArray) = map(cardinality, axes(A))
7579
axes(A::AbstractQuasiArray) = error("Override axes for $(typeof(A))")
@@ -96,6 +100,7 @@ include("matmul.jl")
96100
include("inv.jl")
97101
include("quasiadjtrans.jl")
98102
include("quasidiagonal.jl")
103+
include("quasifill.jl")
99104
include("dense.jl")
100105

101106
include("quasikron.jl")

src/abstractquasiarray.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,6 @@ function copymutable(a::AbstractQuasiArray)
353353
copyto!(similar(a), a)
354354
end
355355

356-
zero(x::AbstractQuasiArray{T}) where {T} = fill!(similar(x), zero(T))
357-
358356
## iteration support for arrays by iterating over `eachindex` in the array ##
359357
# Allows fast iteration by default for both IndexLinear and IndexCartesian arrays
360358

src/indices.jl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,13 @@ to_quasi_index(::Type{IND}, I::AbstractQuasiArray{<:AbstractArray}) where IND<:A
111111
to_quasi_index(A, IND, i) = to_quasi_index(IND,i)
112112

113113
to_indices(A::AbstractQuasiArray, inds, ::Tuple{}) = ()
114+
# if inds is empty then we are indexing past indices, so array-like
115+
to_indices(A::AbstractQuasiArray, ::Tuple{}, I::Tuple{Any,Vararg{Any}}) =
116+
(@_inline_meta; (to_index(A, I[1]), to_indices(A, (), tail(I))...))
114117
to_indices(A::AbstractQuasiArray, inds, I::Tuple{Any,Vararg{Any}}) =
115118
(@_inline_meta; (to_quasi_index(A, eltype(inds[1]), I[1]), to_indices(A, _maybetail(inds), tail(I))...))
119+
@inline to_indices(A::AbstractQuasiArray, inds, I::Tuple{CartesianIndex, Vararg{Any}}) =
120+
to_indices(A, inds, (I[1].I..., tail(I)...))
116121
@inline to_indices(A::AbstractQuasiArray, inds, I::Tuple{Colon, Vararg{Any}}) =
117122
(uncolon(inds, I), to_indices(A, _maybetail(inds), tail(I))...)
118123

@@ -177,6 +182,7 @@ size(S::Inclusion) = (cardinality(S.domain),)
177182
length(S::Inclusion) = cardinality(S.domain)
178183
unsafe_length(S::Inclusion) = cardinality(S.domain)
179184
cardinality(S::Inclusion) = cardinality(S.domain)
185+
measure(x) = cardinality(x) # TODO: Inclusion(0:0.5:1) should have
180186
getindex(S::Inclusion{T}, i::T) where T = (@_inline_meta; @boundscheck checkbounds(S, i); convert(T,i))
181187
getindex(S::Inclusion{T}, i::AbstractArray{T}) where T = (@_inline_meta; @boundscheck checkbounds(S, i); convert(AbstractArray{T},i))
182188
getindex(S::Inclusion, i::Inclusion) = (@_inline_meta; @boundscheck checkbounds(S, i); copy(S))
@@ -197,6 +203,7 @@ checkindex(::Type{Bool}, inds::Inclusion{T}, i::T) where T = i ∈ inds
197203
checkindex(::Type{Bool}, inds::Inclusion, i) = i inds
198204
checkindex(::Type{Bool}, inds::Inclusion, ::Colon) = true
199205
checkindex(::Type{Bool}, inds::Inclusion, ::Inclusion) = true
206+
200207
function __checkindex(::Type{Bool}, inds::Inclusion, I::AbstractArray)
201208
@_inline_meta
202209
b = true
@@ -213,9 +220,6 @@ checkindex(::Type{Bool}, inds::Inclusion{T}, I::AbstractArray{T}) where T<:Abstr
213220
checkindex(::Type{Bool}, inds::Inclusion{T}, I::AbstractArray{<:AbstractArray}) where T<:AbstractArray =
214221
__checkindex(Bool, inds, convert(AbstractArray{T}, I))
215222

216-
@propagate_inbounds _affine_checkindex(inds, r) = isempty(r) | (checkindex(Bool, inds, Base.to_indices(inds, (first(r),))...) & checkindex(Bool, inds, Base.to_indices(inds, (last(r),))...))
217-
@propagate_inbounds checkindex(::Type{Bool}, inds::Inclusion, r::AbstractRange) = _affine_checkindex(inds, r)
218-
219223

220224
checkindex(::Type{Bool}, indx::Inclusion, I::AbstractVector{Bool}) = indx == axes1(I)
221225
checkindex(::Type{Bool}, indx::Inclusion, I::AbstractArray{Bool}) = false

src/lazyquasiarrays.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ MemoryLayout(M::Type{ApplyQuasiArray{T,N,F,Args}}) where {T,N,F,Args} =
7979
copy(A::Applied{LazyQuasiArrayApplyStyle}) = ApplyQuasiArray(A)
8080
copy(A::Applied{<:AbstractQuasiArrayApplyStyle}) = QuasiArray(A)
8181
QuasiArray(A::Applied) = QuasiArray(ApplyQuasiArray(A))
82+
QuasiArray(A::Applied{<:Any,typeof(inv)}) = inv(QuasiArray(A.args[1]))
8283

8384

8485
####

src/matmul.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,10 @@ end
8989

9090
struct QuasiArrayLayout <: MemoryLayout end
9191
MemoryLayout(::Type{<:AbstractQuasiArray}) = QuasiArrayLayout()
92-
92+
Array(M::Mul{<:Any,<:Any,<:Any,<:AbstractQuasiMatrix}) = eltype(M)[M[k,j] for k in axes(M)[1], j in axes(M)[2]]
93+
Array(M::Mul{<:Any,<:Any,<:Any,<:AbstractQuasiVector}) = eltype(M)[M[k] for k in axes(M)[1]]
9394
_quasi_mul(M, _) = QuasiArray(M)
94-
_quasi_mul(M, ::NTuple{N,OneTo{Int}}) where N = Array(QuasiArray(M))
95+
_quasi_mul(M, ::NTuple{N,OneTo{Int}}) where N = Array(M)
9596
copy(M::Mul{QuasiArrayLayout,QuasiArrayLayout}) = _quasi_mul(M, axes(M))
9697
copy(M::Mul{QuasiArrayLayout}) = _quasi_mul(M, axes(M))
9798
copy(M::Mul{<:Any,QuasiArrayLayout}) = _quasi_mul(M, axes(M))
@@ -100,6 +101,9 @@ copy(M::Mul{ApplyLayout{typeof(\)},QuasiArrayLayout}) = ApplyQuasiArray(M)
100101
copy(M::Mul{QuasiArrayLayout,<:AbstractLazyLayout}) = ApplyQuasiArray(M)
101102

102103

104+
LazyArrays._vec_mul_view(a::AbstractQuasiVector, kr, ::Colon) = view(a, kr)
105+
106+
103107
###
104108
# Scalar special case, simplifies x * A and A * x
105109
# Find an AbstractArray to latch on to by commuting

src/multidimensional.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ module QuasiIteratorsMD
99
using Base: IndexLinear, IndexCartesian, AbstractCartesianIndex, fill_to_length, tail
1010
using Base.Iterators: Reverse
1111
import QuasiArrays: AbstractQuasiArray, AbstractQuasiVector, domain, AbstractQuasiOrVector
12+
import StaticArrays: StaticArray
1213

1314
export QuasiCartesianIndex, QuasiCartesianIndices
1415

@@ -423,6 +424,10 @@ to_indices(A::AbstractQuasiArray, I::Tuple{Any}) = (@_inline_meta; to_indices(A,
423424
_, indstail = IteratorsMD.split(inds, Val(N))
424425
(to_index(A, I[1]), to_indices(A, indstail, tail(I))...)
425426
end
427+
Base.to_indices(A::AbstractQuasiArray, I::Tuple{Vararg{Union{Integer, CartesianIndex, StaticArray{<:Tuple,Int}}}}) =
428+
to_indices(A, axes(A), I)
429+
430+
@inline index_shape(A::AbstractQuasiArray, rest...) = (axes(A)..., index_shape(rest...)...)
426431

427432
### From abstractarray.jl: Internal multidimensional indexing definitions ###
428433

src/quasiarray.jl

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ struct QuasiArray{T,N,AXES<:NTuple{N,AbstractVector}} <: AbstractQuasiArray{T,N}
88
end
99
end
1010

11+
QuasiArray{T,N,AXES}(par::AbstractArray{<:Any,N}, axes::AXES) where {T,N,AXES<:NTuple{N,AbstractVector}} =
12+
QuasiArray{T,N,AXES}(convert(AbstractArray{T,N}, par)::AbstractArray{T,N}, axes)
13+
1114
const QuasiMatrix{T,AXES<:NTuple{2,AbstractVector}} = QuasiArray{T,2,AXES}
1215
const QuasiVector{T,AXES<:Tuple{AbstractVector}} = QuasiArray{T,1,AXES}
1316

@@ -28,6 +31,39 @@ QuasiMatrix(par::AbstractMatrix{T}, axes::NTuple{2,AbstractVector}) where T =
2831
QuasiVector(par::AbstractVector{T}, axes::Tuple{AbstractVector}) where T =
2932
QuasiArray{T,1,typeof(axes)}(par, axes)
3033

34+
QuasiArray{T}(par::AbstractArray{<:Any,N}, axes::NTuple{N,AbstractVector}) where {T,N} =
35+
QuasiArray{T,N,typeof(axes)}(par, axes)
36+
QuasiMatrix{T}(par::AbstractMatrix, axes::NTuple{2,AbstractVector}) where T =
37+
QuasiMatrix{T,typeof(axes)}(par, axes)
38+
QuasiVector{T}(par::AbstractVector, axes::Tuple{AbstractVector}) where T =
39+
QuasiVector{T,typeof(axes)}(par, axes)
40+
41+
QuasiArray(par::AbstractArray{T,N}, axes::Vararg{AbstractVector,N}) where {T,N} =
42+
QuasiArray(par, axes)
43+
QuasiMatrix(par::AbstractMatrix{T}, axes::Vararg{AbstractVector,2}) where T =
44+
QuasiMatrix(par, axes)
45+
QuasiVector(par::AbstractVector{T}, axes::AbstractVector) where T =
46+
QuasiVector(par, (axes,))
47+
48+
QuasiArray{T}(par::AbstractArray{<:Any,N}, axes::Vararg{AbstractVector,N}) where {T,N} =
49+
QuasiArray{T}(par, axes)
50+
QuasiMatrix{T}(par::AbstractMatrix, axes::Vararg{AbstractVector,2}) where T =
51+
QuasiMatrix{T}(par, axes)
52+
QuasiVector{T}(par::AbstractVector, axes::AbstractVector) where T =
53+
QuasiVector{T}(par, (axes,))
54+
55+
56+
57+
QuasiMatrix::UniformScaling, ax::NTuple{2,AbstractVector}) = QuasiMatrix(Matrix(λ,map(length,ax)...), ax)
58+
QuasiMatrix{T}::UniformScaling, ax::NTuple{2,AbstractVector}) where T = QuasiMatrix{T}(Matrix(λ,map(length,ax)...), ax)
59+
QuasiMatrix::UniformScaling, ax1::AbstractVector, ax2::AbstractVector) = QuasiMatrix(λ, (ax1, ax2))
60+
QuasiMatrix{T}::UniformScaling, ax1::AbstractVector, ax2::AbstractVector) where T = QuasiMatrix{T}(λ, (ax1, ax2))
61+
62+
63+
QuasiArray(par::AbstractArray) = QuasiArray(par, axes(par))
64+
QuasiMatrix(par::AbstractArray) = QuasiMatrix(par, axes(par))
65+
QuasiVector(par::AbstractArray) = QuasiVector(par, axes(par))
66+
3167
QuasiArray{T,N,AXES}(par::AbstractArray{T,N}, axes::NTuple{N,AbstractQuasiOrVector}) where {T,N,AXES} =
3268
QuasiArray{T,N,AXES}(par, map(domain,axes))
3369
QuasiArray{T,N}(par::AbstractArray{T,N}, axes::NTuple{N,AbstractQuasiOrVector}) where {T,N} =
@@ -45,9 +81,9 @@ QuasiVector(par::AbstractVector{T}, axes::AbstractArray) where {T} =
4581
QuasiVector(par, (axes,))
4682

4783

48-
QuasiArray(a::AbstractQuasiArray) = QuasiArray(Array(a), axes(a))
49-
QuasiArray{T}(a::AbstractQuasiArray) where T = QuasiArray(Array{T}(a), axes(a))
50-
QuasiArray{T,N}(a::AbstractQuasiArray{<:Any,N}) where {T,N} = QuasiArray(Array{T}(a), axes(a))
84+
QuasiArray(a::AbstractQuasiArray) = QuasiArray(a[map(collect,axes(a))...], axes(a))
85+
QuasiArray{T}(a::AbstractQuasiArray) where T = QuasiArray(convert(AbstractArray{T},a[map(collect,axes(a))...]), axes(a))
86+
QuasiArray{T,N}(a::AbstractQuasiArray{<:Any,N}) where {T,N} = QuasiArray(convert(AbstractArray{T,N},a[map(collect,axes(a))...]), axes(a))
5187
QuasiArray{T,N,AXES}(a::AbstractQuasiArray{<:Any,N}) where {T,N,AXES} = QuasiArray{T,N,AXES}(Array{T}(a), axes(a))
5288
QuasiMatrix(a::AbstractQuasiMatrix) = QuasiArray(a)
5389
QuasiVector(a::AbstractQuasiVector) = QuasiArray(a)
@@ -61,14 +97,17 @@ convert(::Type{AbstractQuasiArray{T}}, a::QuasiArray) where T = convert(QuasiArr
6197
convert(::Type{AbstractQuasiArray{T,N}}, a::QuasiArray{T,N}) where {T,N} = a
6298
convert(::Type{AbstractQuasiArray{T}}, a::QuasiArray{T}) where T = a
6399

100+
AbstractQuasiArray{T,N}(a::QuasiArray) where {T,N} = QuasiArray{T,N}(a)
101+
AbstractQuasiArray{T}(a::QuasiArray) where T = QuasiArray{T}(a)
102+
64103

65104
_inclusion(d::Slice) = d
66105
_inclusion(d::OneTo) = d
67106
_inclusion(d::IdentityUnitRange{<:Integer}) = d
68-
_inclusion(d::AbstractUnitRange{<:Integer}) = Slice(d)
107+
_inclusion(d::AbstractUnitRange{<:Integer}) = IdentityUnitRange(d)
69108
_inclusion(d) = Inclusion(d)
70109

71-
axes(A::QuasiArray) = _inclusion.(A.axes)
110+
axes(A::QuasiArray) = map(_inclusion,A.axes)
72111
parent(A::QuasiArray) = A.parent
73112

74113
@propagate_inbounds @inline function _getindex(::Type{IND}, A::QuasiArray, I::IND) where IND
@@ -89,3 +128,9 @@ end
89128

90129
^(A::QuasiMatrix, p::Number) = _quasimatrix_pow(A, p)
91130
^(A::QuasiMatrix, p::Integer) = _quasimatrix_pow(A, p)
131+
132+
133+
==(A::QuasiArray{T,N,NTuple{N,OneTo{Int}}}, B::AbstractArray{V,N}) where {T,V,N} =
134+
axes(A) == axes(B) && A.parent == B
135+
==(B::AbstractArray{V,N}, A::QuasiArray{T,N,NTuple{N,OneTo{Int}}}) where {T,V,N} =
136+
A == B

src/quasiconcat.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,24 @@ ApplyStyle(::typeof(hcat), ::Type{<:AbstractQuasiArray}...) = LazyQuasiArrayAppl
77

88
axes(f::ApplyQuasiMatrix{<:Any,typeof(hcat)}) = (axes(f.args[1],1), oneto(sum(size.(f.args,2))))
99

10+
_vecormat_getindex(A::AbstractQuasiMatrix,k,ξ) = A[k,ξ]
11+
_vecormat_getindex(A::AbstractQuasiVector,k,ξ) = A[k]
12+
@inline LazyArrays._view_hcat(a::AbstractQuasiVector, kr, jr::Colon) = view(a, kr)
13+
# TODO: generalize
14+
@inline LazyArrays._view_hcat(a::AbstractQuasiVector, kr::Number, jr) = a[kr]
15+
1016
function getindex(f::ApplyQuasiMatrix{T,typeof(hcat)}, k::Number, j::Number) where T
1117
ξ = j
1218
for A in f.args
1319
n = size(A,2)
14-
ξ  n && return T(A[k,ξ])::T
20+
ξ  n && return T(_vecormat_getindex(A,k,ξ))::T
1521
ξ -= n
1622
end
1723
throw(BoundsError(f, (k,j)))
1824
end
1925

26+
\(A::AbstractQuasiArray, H::ApplyQuasiMatrix{<:Any,typeof(hcat)}) = hcat((Ref(A) .\ H.args)...)
27+
2028
"""
2129
UnionVcat
2230

src/quasidiagonal.jl

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ julia> QuasiDiagonal(A)
3535
"""
3636
QuasiDiagonal(A::AbstractQuasiMatrix) = QuasiDiagonal(diag(A))
3737

38-
Diagonal(A::AbstractQuasiArray) = QuasiDiagonal(A)
38+
@deprecate Diagonal(A::AbstractQuasiArray) QuasiDiagonal(A)
3939

4040

4141
"""
@@ -63,8 +63,11 @@ QuasiDiagonal{T}(D::QuasiDiagonal{T}) where {T} = D
6363
QuasiDiagonal{T}(D::QuasiDiagonal) where {T} = QuasiDiagonal{T}(D.diag)
6464

6565
AbstractQuasiMatrix{T}(D::QuasiDiagonal) where {T} = QuasiDiagonal{T}(D)
66-
Matrix(D::QuasiDiagonal) = diagm(0 => D.diag)
67-
Array(D::QuasiDiagonal) = Matrix(D)
66+
AbstractQuasiArray{T}(D::QuasiDiagonal) where T = AbstractQuasiMatrix{T}(D)
67+
68+
convert(::Type{QuasiDiagonal}, A::QuasiDiagonal) = A
69+
convert(::Type{QuasiDiagonal{T}}, A::QuasiDiagonal{T}) where T = A
70+
convert(::Type{QuasiDiagonal{T}}, A::QuasiDiagonal) where T = QuasiDiagonal(convert(AbstractQuasiVector{T}, A.diag))
6871

6972
# For D<:QuasiDiagonal, similar(D[, neweltype]) should yield a QuasiDiagonal matrix.
7073
# On the other hand, similar(D, [neweltype,] shape...) should yield a sparse matrix.
@@ -196,3 +199,7 @@ for f in (:exp, :log, :sqrt,
196199
@eval $f(D::QuasiDiagonal) = QuasiDiagonal($f.(D.diag))
197200
end
198201

202+
203+
permutedims(D::QuasiDiagonal) = D
204+
inv(D::QuasiDiagonal) = QuasiDiagonal(inv.(D.diag))
205+
copy(D::QuasiDiagonal) = QuasiDiagonal(copy(D.diag))

0 commit comments

Comments
 (0)