# Simplify type information when reinterpreting/reshaping

**URL:** <https://discourse.julialang.org/t/simplify-type-information-when-reinterpreting-reshaping/66909>\
**Category:** General Usage\
**Created:** [August 24, 2021, 12:19pm UTC](https://discourse.julialang.org/t/simplify-type-information-when-reinterpreting-reshaping/66909 "2021-08-24T12:19:21Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)\
**Post date:** [August 24, 2021, 12:19pm UTC](https://discourse.julialang.org/t/simplify-type-information-when-reinterpreting-reshaping/66909/1 "2021-08-24T12:19:21Z")

</div>

I frequently have to do things like this:

```julia
julia> x = rand(3,10)
3×10 Matrix{Float64}:
 0.233999 0.217953 0.391807 0.396972 0.612708 0.344216 0.513826 0.724808 0.222591 0.668894
 0.152236 0.0596347 0.297019 0.320482 0.864853 0.658225 0.72082 0.966251 0.429694 0.980746
 0.181907 0.561663 0.991661 0.968927 0.800681 0.838888 0.624427 0.874867 0.818654 0.536921

julia> y = reinterpret(reshape,SVector{3,Float64},x)
10-element reinterpret(reshape, SVector{3, Float64}, ::Matrix{Float64}) with eltype SVector{3, Float64}:
 [0.23399915174244423, 0.1522357683743134, 0.1819071100157874]
 [0.21795312154627955, 0.059634728256461544, 0.5616633601811634]
 [0.39180686893905836, 0.29701928018071544, 0.9916612904284883]
...

```

Is there some command that makes ` y` be just a ` Vector{SVector{3,Float64}}` , instead of carrying forever all its original type? (I mean particularly in this case, where the memory layouts are the same, as far as I understand).

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [August 24, 2021, 1:52pm UTC](https://discourse.julialang.org/t/simplify-type-information-when-reinterpreting-reshaping/66909/2 "2021-08-24T13:52:43Z")

</div>

In the [StaticArrays.jl doc](https://juliaarrays.github.io/StaticArrays.jl/stable/pages/api/#Arrays-of-static-arrays-1) it is suggested to define some `svectors()` or `svectorscopy()` functions for this task.

---

<div class="post-metadata">

**Author:** ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)\
**Post date:** [August 24, 2021, 2:44pm UTC](https://discourse.julialang.org/t/simplify-type-information-when-reinterpreting-reshaping/66909/3 "2021-08-24T14:44:07Z")

</div>

If I copy the data the type signature changes, but I would like to not copy.

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [August 24, 2021, 2:56pm UTC](https://discourse.julialang.org/t/simplify-type-information-when-reinterpreting-reshaping/66909/4 "2021-08-24T14:56:23Z")

</div>

Probably missing the point 🙂 , but what type signature changes in example below?

```julia
function svectorscopy(x::Matrix{T}, ::Val{N}) where {T,N}
    size(x,1) == N || error("sizes mismatch")
    isbitstype(T) || error("use for bitstypes only")
    copy(reinterpret(SVector{N,T}, vec(x)))
end

x = rand(3,10)
y = svectorscopy(x, Val{3}())

10-element Vector{SVector{3, Float64}}:
 [0.2934038605494145, 0.7926735779438824, 0.32679136208850756]
 [0.9627113447751533, 0.07318706625463711, 0.8181536397448753]
 [0.19577880969394235, 0.193712489726949, 0.009605787454978976]
 [0.11050497078529231, 0.47596496598727633, 0.7392340772243953]
 [0.8758005379065857, 0.5946355196925027, 0.32579452774945816]
 [0.18191497127368395, 0.627220353635663, 0.5098188072009696]
 [0.1845299828496222, 0.8192515115780793, 0.7930647894907568]
 [0.895422764583234, 0.7529396456277849, 0.07670529122150205]
 [0.5884055415673282, 0.8693150682627604, 0.7793829961607535]
 [0.7968259720647202, 0.872461845502001, 0.9392783282178289]

```

Or without copying:

```julia
function svectors(x::Matrix{T}, ::Val{N}) where {T,N}
    size(x,1) == N || error("sizes mismatch")
    isbitstype(T) || error("use for bitstypes only")
    reinterpret(SVector{N,T}, vec(x))
end

x = rand(3,10)
y = svectors(x, Val{3}())

10-element reinterpret(SVector{3, Float64}, ::Vector{Float64}):
 [0.43484279489143973, 0.3433845181618924, 0.8949897891014285]
 [0.5632122167660084, 0.00808457834710985, 0.13876411174217862]
 [0.4314491754059935, 0.24532306263713932, 0.9433935437475155]
 [0.5817430805373387, 0.8486724899701844, 0.1666691669108591]
 [0.8196370888035363, 0.8179178128661923, 0.7780387513807245]
 [0.22964414518776088, 0.824704961854821, 0.543947079105416]
 [0.6311081948549806, 0.14342382498659412, 0.5339623599311454]
 [0.28299016894967266, 0.6468720901975916, 0.639679142608495]
 [0.6212645796710144, 0.053254068944845745, 0.296617488302537]
 [0.00187153138118068, 0.1692451204229175, 0.5988612165522477]

```

---

<div class="post-metadata">

**Author:** ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)\
**Post date:** [August 24, 2021, 3:58pm UTC](https://discourse.julialang.org/t/simplify-type-information-when-reinterpreting-reshaping/66909/5 "2021-08-24T15:58:09Z")

</div>

What I want is to _not_ copy and get the result as:

```julia
10-element Vector{SVector{3, Float64}}

```

(But, FYI, this is only about ahestetics)
