@@ -6,40 +6,38 @@ transformation.
6
6
"""
7
7
function to_vec (x:: Number )
8
8
function Number_from_vec (x_vec)
9
- return first (x_vec)
9
+ return oftype (x, first (x_vec) )
10
10
end
11
11
return [x], Number_from_vec
12
12
end
13
13
14
- # Vectors
14
+ # Base case -- if x is already a Vector{<:Number} there's no conversion necessary.
15
15
to_vec (x:: Vector{<:Number} ) = (x, identity)
16
- function to_vec (x:: Vector )
16
+
17
+ function to_vec (x:: AbstractVector )
17
18
x_vecs_and_backs = map (to_vec, x)
18
19
x_vecs, backs = first .(x_vecs_and_backs), last .(x_vecs_and_backs)
19
20
function Vector_from_vec (x_vec)
20
21
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)
22
24
end
23
25
return vcat (x_vecs... ), Vector_from_vec
24
26
end
25
27
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))
33
31
34
- function to_vec (x:: Array )
35
- x_vec, back = to_vec (reshape (x, :))
36
32
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) ))
38
34
end
35
+
39
36
return x_vec, Array_from_vec
40
37
end
41
38
42
- # AbstractArrays
39
+ # Some specific subtypes of AbstractArray.
40
+
43
41
function to_vec (x:: T ) where {T<: LinearAlgebra.AbstractTriangular }
44
42
x_vec, back = to_vec (Matrix (x))
45
43
function AbstractTriangular_from_vec (x_vec)
@@ -63,17 +61,25 @@ function to_vec(X::Diagonal)
63
61
end
64
62
65
63
function to_vec (X:: Transpose )
64
+
65
+ x_vec, x_from_vec = to_vec (X. parent)
66
+
66
67
function Transpose_from_vec (x_vec)
67
- return Transpose (permutedims ( reshape ( x_vec, size (X)) ))
68
+ return Transpose (x_from_vec ( x_vec))
68
69
end
69
- return vec (Matrix (X)), Transpose_from_vec
70
+
71
+ return x_vec, Transpose_from_vec
70
72
end
71
73
72
74
function to_vec (X:: Adjoint )
75
+
76
+ x_vec, x_from_vec = to_vec (X. parent)
77
+
73
78
function Adjoint_from_vec (x_vec)
74
- return Adjoint (conj! ( permutedims ( reshape ( x_vec, size (X))) ))
79
+ return Adjoint (x_from_vec ( x_vec))
75
80
end
76
- return vec (Matrix (X)), Adjoint_from_vec
81
+
82
+ return x_vec, Adjoint_from_vec
77
83
end
78
84
79
85
# Non-array data structures
0 commit comments