@@ -419,19 +419,18 @@ promote_to_arrays(n,k, ::Type{T}, A, B, Cs...) where {T} =
419
419
(promote_to_arrays_ (n[k], T, A), promote_to_arrays_ (n[k+ 1 ], T, B), promote_to_arrays (n,k+ 2 , T, Cs... )... )
420
420
promote_to_array_type (A:: Tuple{Vararg{Union{AbstractVecOrMat,UniformScaling,Number}}} ) = Matrix
421
421
422
- _us2number (A ) = A
423
- _us2number (J :: UniformScaling ) = J . λ
422
+ szfun ( :: UniformScaling , _ ) = - 1
423
+ szfun (A, dim ) = ( require_one_based_indexing (A); return size (A, dim))
424
424
425
425
for (f, _f, dim, name) in ((:hcat , :_hcat , 1 , " rows" ), (:vcat , :_vcat , 2 , " cols" ))
426
426
@eval begin
427
427
@inline $ f (A:: Union{AbstractVecOrMat,UniformScaling} ...) = $ _f (A... )
428
- @inline $ f (A:: Union{AbstractVecOrMat,UniformScaling,Number} ...) = $ f ( map (_us2number, A) ... )
428
+ @inline $ f (A:: Union{AbstractVecOrMat,UniformScaling,Number} ...) = $ _f (A ... )
429
429
function $_f (A:: Union{AbstractVecOrMat,UniformScaling,Number} ...; array_type = promote_to_array_type (A))
430
430
n = - 1
431
- for a in A
432
- if ! isa (a, UniformScaling)
433
- require_one_based_indexing (a)
434
- na = size (a,$ dim)
431
+ sizes = map (a -> szfun (a, $ dim), A)
432
+ for na in sizes
433
+ if na != - 1
435
434
n >= 0 && n != na &&
436
435
throw (DimensionMismatch (string (" number of " , $ name,
437
436
" of each array must match (got " , n, " and " , na, " )" )))
@@ -455,9 +454,9 @@ function _hvcat(rows::Tuple{Vararg{Int}}, A::Union{AbstractVecOrMat,UniformScali
455
454
j = 0
456
455
for i = 1 : nr # infer UniformScaling sizes from row counts, if possible:
457
456
ni = - 1 # number of rows in this block-row, -1 indicates unknown
458
- for k = 1 : rows[i]
459
- if ! isa (A[j + k], UniformScaling)
460
- na = size (A[j + k], 1 )
457
+ sizes = map (a -> szfun (a, 1 ), A[j + 1 : j + rows[i]])
458
+ for na in sizes
459
+ if na != - 1
461
460
ni >= 0 && ni != na &&
462
461
throw (DimensionMismatch (" mismatch in number of rows" ))
463
462
ni = na
0 commit comments