diff --git a/stdlib/LinearAlgebra/src/uniformscaling.jl b/stdlib/LinearAlgebra/src/uniformscaling.jl index 5ff76e7bfbd2b..1e7713288c7b5 100644 --- a/stdlib/LinearAlgebra/src/uniformscaling.jl +++ b/stdlib/LinearAlgebra/src/uniformscaling.jl @@ -419,19 +419,18 @@ promote_to_arrays(n,k, ::Type{T}, A, B, Cs...) where {T} = (promote_to_arrays_(n[k], T, A), promote_to_arrays_(n[k+1], T, B), promote_to_arrays(n,k+2, T, Cs...)...) promote_to_array_type(A::Tuple{Vararg{Union{AbstractVecOrMat,UniformScaling,Number}}}) = Matrix -_us2number(A) = A -_us2number(J::UniformScaling) = J.λ +szfun(::UniformScaling, _) = -1 +szfun(A, dim) = (require_one_based_indexing(A); return size(A, dim)) for (f, _f, dim, name) in ((:hcat, :_hcat, 1, "rows"), (:vcat, :_vcat, 2, "cols")) @eval begin @inline $f(A::Union{AbstractVecOrMat,UniformScaling}...) = $_f(A...) - @inline $f(A::Union{AbstractVecOrMat,UniformScaling,Number}...) = $f(map(_us2number, A)...) + @inline $f(A::Union{AbstractVecOrMat,UniformScaling,Number}...) = $_f(A...) function $_f(A::Union{AbstractVecOrMat,UniformScaling,Number}...; array_type = promote_to_array_type(A)) n = -1 - for a in A - if !isa(a, UniformScaling) - require_one_based_indexing(a) - na = size(a,$dim) + sizes = map(a -> szfun(a, $dim), A) + for na in sizes + if na != -1 n >= 0 && n != na && throw(DimensionMismatch(string("number of ", $name, " of each array must match (got ", n, " and ", na, ")"))) @@ -455,9 +454,9 @@ function _hvcat(rows::Tuple{Vararg{Int}}, A::Union{AbstractVecOrMat,UniformScali j = 0 for i = 1:nr # infer UniformScaling sizes from row counts, if possible: ni = -1 # number of rows in this block-row, -1 indicates unknown - for k = 1:rows[i] - if !isa(A[j+k], UniformScaling) - na = size(A[j+k], 1) + sizes = map(a -> szfun(a, 1), A[j+1:j+rows[i]]) + for na in sizes + if na != -1 ni >= 0 && ni != na && throw(DimensionMismatch("mismatch in number of rows")) ni = na