@@ -6,40 +6,38 @@ transformation.
66"""
77function to_vec (x:: Number )
88 function Number_from_vec (x_vec)
9- return first (x_vec)
9+ return oftype (x, first (x_vec) )
1010 end
1111 return [x], Number_from_vec
1212end
1313
14- # Vectors
14+ # Base case -- if x is already a Vector{<:Number} there's no conversion necessary.
1515to_vec (x:: Vector{<:Number} ) = (x, identity)
16- function to_vec (x:: Vector )
16+
17+ function to_vec (x:: AbstractVector )
1718 x_vecs_and_backs = map (to_vec, x)
1819 x_vecs, backs = first .(x_vecs_and_backs), last .(x_vecs_and_backs)
1920 function Vector_from_vec (x_vec)
2021 sz = cumsum (map (length, x_vecs))
21- return [backs[n](x_vec[sz[n] - length (x_vecs[n]) + 1 : sz[n]]) for n in eachindex (x)]
22+ x_Vec = [backs[n](x_vec[sz[n] - length (x_vecs[n]) + 1 : sz[n]]) for n in eachindex (x)]
23+ return oftype (x, x_Vec)
2224 end
2325 return vcat (x_vecs... ), Vector_from_vec
2426end
2527
26- # Arrays
27- function to_vec (x:: Array{<:Number} )
28- function Array_from_vec (x_vec)
29- return reshape (x_vec, size (x))
30- end
31- return vec (x), Array_from_vec
32- end
28+ function to_vec (x:: AbstractArray )
29+
30+ x_vec, from_vec = to_vec (vec (x))
3331
34- function to_vec (x:: Array )
35- x_vec, back = to_vec (reshape (x, :))
3632 function Array_from_vec (x_vec)
37- return reshape (back (x_vec), size (x))
33+ return oftype (x, reshape (from_vec (x_vec), size (x) ))
3834 end
35+
3936 return x_vec, Array_from_vec
4037end
4138
42- # AbstractArrays
39+ # Some specific subtypes of AbstractArray.
40+
4341function to_vec (x:: T ) where {T<: LinearAlgebra.AbstractTriangular }
4442 x_vec, back = to_vec (Matrix (x))
4543 function AbstractTriangular_from_vec (x_vec)
@@ -63,17 +61,25 @@ function to_vec(X::Diagonal)
6361end
6462
6563function to_vec (X:: Transpose )
64+
65+ x_vec, x_from_vec = to_vec (X. parent)
66+
6667 function Transpose_from_vec (x_vec)
67- return Transpose (permutedims ( reshape ( x_vec, size (X)) ))
68+ return Transpose (x_from_vec ( x_vec))
6869 end
69- return vec (Matrix (X)), Transpose_from_vec
70+
71+ return x_vec, Transpose_from_vec
7072end
7173
7274function to_vec (X:: Adjoint )
75+
76+ x_vec, x_from_vec = to_vec (X. parent)
77+
7378 function Adjoint_from_vec (x_vec)
74- return Adjoint (conj! ( permutedims ( reshape ( x_vec, size (X))) ))
79+ return Adjoint (x_from_vec ( x_vec))
7580 end
76- return vec (Matrix (X)), Adjoint_from_vec
81+
82+ return x_vec, Adjoint_from_vec
7783end
7884
7985# Non-array data structures
0 commit comments