# StaticArray using generator

**URL:** <https://discourse.julialang.org/t/staticarray-using-generator/118263>\
**Category:** Specific Domains\
**Tags:** question, staticarrays\
**Created:** [August 16, 2024, 9:38am UTC](https://discourse.julialang.org/t/staticarray-using-generator/118263 "2024-08-16T09:38:05Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Domenico\_Lahaye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/domenico_lahaye/32/203728_2.png) [@Domenico\_Lahaye](https://discourse.julialang.org/u/Domenico_Lahaye)\
**Post date:** [August 16, 2024, 9:38am UTC](https://discourse.julialang.org/t/staticarray-using-generator/118263/1 "2024-08-16T09:38:05Z")

</div>

I am trying to replace

```julia
# naive version that does works but fails to scale  
i1 = 1; i2 = 2; i3 = 3; 
I = SVector(i1, i1, i1, i2, i2, i2, i3, i3, i3)

```

by something better. The following code

```julia
I1 = SVector(i1, i2, i3) 
I2 = SVector{9}( I1[i] for i in 1:3 for j in 1:3 )

```

yields

DimensionMismatch: No precise constructor for SVector{9} found. Length of input was 1.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 16, 2024, 9:55am UTC](https://discourse.julialang.org/t/staticarray-using-generator/118263/2 "2024-08-16T09:55:43Z")

</div>

This looks like a job for the `@SArray` (or `@SVector`) macro. Unfortunately, it doesn’t quite work:

```julia
julia> @SArray [I1[i] for i in 1:3]
3-element SVector{3, Int64} with indices SOneTo(3):
 1
 2
 3

julia> @SArray [I1[i] for i in 1:3, j in 1:3]
3×3 SMatrix{3, 3, Int64, 9} with indices SOneTo(3)×SOneTo(3):
 1 1 1
 2 2 2
 3 3 3

julia> @SArray [I1[i] for i in 1:3 for j in 1:3]
ERROR: LoadError: Expected generator in comprehension, e.g. [f(i,j) for i = 1:3, j = 1:3]

```

It seems like this particular syntax just isn’t supported. An alternative is to create a vector and convert to `SVector`:

```julia
julia> SVector{9}( [I1[i] for i in 1:3 for j in 1:3] )
9-element SVector{9, Int64} with indices SOneTo(9):
 1
 1
 1
 2
 2
 2
 3
 3
 3

```

but this allocates an intermediate vector. A more efficient, but less elegant, workaround is:

```julia
julia> vec(@SArray [I1[i] for j in 1:3, i in 1:3]) # notice switched indexing order
9-element SVector{9, Int64} with indices SOneTo(9):
 1
 1
 1
 2
 2
 2
 3
 3
 3

```

This should be close to maximally efficient, I think.

---

<div class="post-metadata">

**Author:** ![Domenico\_Lahaye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/domenico_lahaye/32/203728_2.png) [@Domenico\_Lahaye](https://discourse.julialang.org/u/Domenico_Lahaye)\
**Post date:** [August 16, 2024, 10:43am UTC](https://discourse.julialang.org/t/staticarray-using-generator/118263/3 "2024-08-16T10:43:45Z")

</div>

Thx again. I am looking into it.

---

<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 16, 2024, 10:59am UTC](https://discourse.julialang.org/t/staticarray-using-generator/118263/4 "2024-08-16T10:59:12Z")

</div>

> [@Domenico\_Lahaye](#):
>
> `I2 = SVector{9}( I1[i] for i in 1:3 for j in 1:3 )`

If you splat the generator it works:

```julia
SVector{9}((I1[i] for i in 1:3 for j in 1:3)...)

```

---

<div class="post-metadata">

**Author:** ![Domenico\_Lahaye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/domenico_lahaye/32/203728_2.png) [@Domenico\_Lahaye](https://discourse.julialang.org/u/Domenico_Lahaye)\
**Post date:** [August 16, 2024, 11:12am UTC](https://discourse.julialang.org/t/staticarray-using-generator/118263/5 "2024-08-16T11:12:52Z")

</div>

The master at work, he he.

Why does splatting make it work? Thx.

---

<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 16, 2024, 11:39am UTC](https://discourse.julialang.org/t/staticarray-using-generator/118263/6 "2024-08-16T11:39:21Z")

</div>

I think you should use `sacollect()` to collect a StaticArray from a generator - [see doc here](https://juliaarrays.github.io/StaticArrays.jl/stable/api/#StaticArrays.sacollect):

```julia
using StaticArrays: sacollect
...
sacollect(SVector{9, Int}, I1[i] for i in 1:3 for j in 1:3)

```

---

<div class="post-metadata">

**Author:** ![Domenico\_Lahaye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/domenico_lahaye/32/203728_2.png) [@Domenico\_Lahaye](https://discourse.julialang.org/u/Domenico_Lahaye)\
**Post date:** [August 16, 2024, 11:48am UTC](https://discourse.julialang.org/t/staticarray-using-generator/118263/7 "2024-08-16T11:48:53Z")

</div>

Will give it a look. Thx!
