|
2 | 2 | function _convert(A::Type{<:AbstractArray}, a::AbstractArray) |
3 | 3 | return convert(A, a) |
4 | 4 | end |
| 5 | +# Custom `_convert` works around the issue that |
| 6 | +# `convert(::Type{<:Diagonal}, ::AbstractMatrix)` isnt' defined |
| 7 | +# in Julia v1.10 (https://github.com/JuliaLang/julia/pull/48895, |
| 8 | +# https://github.com/JuliaLang/julia/pull/52487). |
| 9 | +# TODO: Delete once we drop support for Julia v1.10. |
| 10 | +using LinearAlgebra: LinearAlgebra, Diagonal, diag, isdiag |
| 11 | +_construct(A::Type{<:Diagonal}, a::AbstractMatrix) = A(diag(a)) |
| 12 | +function _convert(A::Type{<:Diagonal}, a::AbstractMatrix) |
| 13 | + LinearAlgebra.checksquare(a) |
| 14 | + return isdiag(a) ? _construct(A, a) : throw(InexactError(:convert, A, a)) |
| 15 | +end |
5 | 16 |
|
6 | 17 | struct KroneckerArray{T,N,A<:AbstractArray{T,N},B<:AbstractArray{T,N}} <: AbstractArray{T,N} |
7 | 18 | a::A |
@@ -39,7 +50,7 @@ function Base.copyto!(dest::KroneckerArray, src::KroneckerArray) |
39 | 50 | end |
40 | 51 |
|
41 | 52 | function Base.convert(::Type{KroneckerArray{T,N,A,B}}, a::KroneckerArray) where {T,N,A,B} |
42 | | - return KroneckerArray(convert(A, arg1(a)), convert(B, arg2(a))) |
| 53 | + return KroneckerArray(_convert(A, arg1(a)), _convert(B, arg2(a))) |
43 | 54 | end |
44 | 55 |
|
45 | 56 | # Like `similar` but allows some custom behavior, such as for `FillArrays.Eye`. |
|
0 commit comments