@@ -712,29 +712,29 @@ cat(catdim::Integer) = Array(Any, 0)
712
712
713
713
vcat () = Array (Any, 0 )
714
714
hcat () = Array (Any, 0 )
715
+ typed_vcat (T:: Type ) = Array (T, 0 )
716
+ typed_hcat (T:: Type ) = Array (T, 0 )
715
717
716
718
# # cat: special cases
717
- hcat {T} (X:: T... ) = T[ X[j] for i= 1 , j= 1 : length (X) ]
718
- hcat {T<:Number} (X:: T... ) = T[ X[j] for i= 1 , j= 1 : length (X) ]
719
719
vcat {T} (X:: T... ) = T[ X[i] for i= 1 : length (X) ]
720
720
vcat {T<:Number} (X:: T... ) = T[ X[i] for i= 1 : length (X) ]
721
+ hcat {T} (X:: T... ) = T[ X[j] for i= 1 , j= 1 : length (X) ]
722
+ hcat {T<:Number} (X:: T... ) = T[ X[j] for i= 1 , j= 1 : length (X) ]
721
723
722
- function vcat (X:: Number... )
723
- T = promote_typeof (X... )
724
- hvcat_fill (Array (T,length (X)), X)
725
- end
724
+ vcat (X:: Number... ) = hvcat_fill ( Array ( promote_typeof (X ... ), length (X)), X )
725
+ hcat (X :: Number... ) = hvcat_fill ( Array ( promote_typeof (X... ), 1 , length (X)), X )
726
+ typed_vcat (T :: Type , X :: Number... ) = hvcat_fill (Array (T,length (X)), X)
727
+ typed_hcat (T :: Type , X :: Number... ) = hvcat_fill ( Array (T, 1 , length (X)), X)
726
728
727
- function hcat (X:: Number... )
728
- T = promote_typeof (X... )
729
- hvcat_fill (Array (T,1 ,length (X)), X)
730
- end
729
+ vcat (V:: AbstractVector... ) = typed_vcat (promote_eltype (V... ), V... )
730
+ vcat {T} (V:: AbstractVector{T} ...) = typed_vcat (T, V... )
731
731
732
- function vcat {T} ( V:: AbstractVector{T} ...)
732
+ function typed_vcat (T :: Type , V:: AbstractVector... )
733
733
n:: Int = 0
734
734
for Vk in V
735
735
n += length (Vk)
736
736
end
737
- a = similar (full (V[1 ]), n)
737
+ a = similar (full (V[1 ]), T, n)
738
738
pos = 1
739
739
for k= 1 : length (V)
740
740
Vk = V[k]
@@ -745,7 +745,10 @@ function vcat{T}(V::AbstractVector{T}...)
745
745
a
746
746
end
747
747
748
- function hcat {T} (A:: AbstractVecOrMat{T} ...)
748
+ hcat (A:: AbstractVecOrMat... ) = typed_hcat (promote_eltype (A... ), A... )
749
+ hcat {T} (A:: AbstractVecOrMat{T} ...) = typed_hcat (T, A... )
750
+
751
+ function typed_hcat (T:: Type , A:: AbstractVecOrMat... )
749
752
nargs = length (A)
750
753
nrows = size (A[1 ], 1 )
751
754
ncols = 0
@@ -759,7 +762,7 @@ function hcat{T}(A::AbstractVecOrMat{T}...)
759
762
nd = ndims (Aj)
760
763
ncols += (nd== 2 ? size (Aj,2 ) : 1 )
761
764
end
762
- B = similar (full (A[1 ]), nrows, ncols)
765
+ B = similar (full (A[1 ]), T, nrows, ncols)
763
766
pos = 1
764
767
if dense
765
768
for k= 1 : nargs
@@ -779,7 +782,10 @@ function hcat{T}(A::AbstractVecOrMat{T}...)
779
782
return B
780
783
end
781
784
782
- function vcat {T} (A:: AbstractMatrix{T} ...)
785
+ vcat (A:: AbstractMatrix... ) = typed_vcat (promote_eltype (A... ), A... )
786
+ vcat {T} (A:: AbstractMatrix{T} ...) = typed_vcat (T, A... )
787
+
788
+ function typed_vcat (T:: Type , A:: AbstractMatrix... )
783
789
nargs = length (A)
784
790
nrows = sum (a-> size (a, 1 ), A):: Int
785
791
ncols = size (A[1 ], 2 )
@@ -788,7 +794,7 @@ function vcat{T}(A::AbstractMatrix{T}...)
788
794
throw (ArgumentError (" number of columns of each array must match (got $(map (x-> size (x,2 ), A)) )" ))
789
795
end
790
796
end
791
- B = similar (full (A[1 ]), nrows, ncols)
797
+ B = similar (full (A[1 ]), T, nrows, ncols)
792
798
pos = 1
793
799
for k= 1 : nargs
794
800
Ak = A[k]
0 commit comments