# How to loop over vector with varying inner-dimensions?

Hello!

Suppose I have:

``````Values = SVector{3, Int64}[[3, 0, 1], [2, 3, 4], [3, 4, 3], [2, 3, 2], [0, 2, 2], [4, 2, 4], [4, 2, 4], [0, 3, 3], [4, 2, 0], [2, 2, 0], [0, 0, 0], [0, 0, 2], [2, 1, 4], [2, 0, 4], [1, 2, 2], [1, 1, 0], [0, 1, 2], [1, 3, 4], [1, 4, 4], [4, 0, 1]]
``````

Which a Vector of SVectors with a dimension of 3. I can loop over this as such:

``````for (i,j,k) in Values
# do something
end
``````

Suppose now I have:

``````Values = SVector{2, Int64}[[3, 0], [2, 3], [3, 4], [2, 3], [0, 2], [4, 2], [4, 2], [0, 3], [4, 2], [2, 2], [0, 0], [0, 0], [2, 1], [2, 0,], [1, 2], [1, 1], [0, 1], [1, 3], [1, 4], [4, 0]]
``````

Now looping with the previous loop, with (i,j,k) will fail. I know I can change it to (i,j). My question is instead;

Is there an elegant way to avoid switching amount of indices by a â€śmanualâ€ť decision and instead let code handle it?

Other than â€śif dim = 2, (i,j) if dim = 3, (i,j,k)â€ť

Kind regards

that doesnâ€™t make sense, what are you gonna do with `i,j,k` anyway if you donâ€™t know how many of them (or even what variable names they will take on) ahead of time?

you can do a double loop maybe:

``````for element in Values
for i in element
``````

I suggest you also show what you do with the values later in the function

It is because I need it to index into a matrix, which can at times be dimensions = 2 or 3.

Perhaps I should find a way to make it into a single vector with some kind of linear indexing then

you can index a matrix by splitting the SVector:

``````julia> m = rand(2,2)
2Ă—2 Matrix{Float64}:
0.213414  0.272632
0.48035   0.538782

julia> a = [1,2];

julia> m[a...]
0.2726319412873929
``````

or use `CartesianIndex`, you can directly index a matrix with that.

1 Like

You donâ€™t need SVectors for this. Just use either CartesianIndex or tuples:

``````vals = [(3,0,1), (2,3,4), (3,4,3), ...]
``````

And then use splatting, as mentioned:

``````for ind in vals
M[ind...] =
end
``````
1 Like

Donâ€™t know who to mark as solution, thank you both guys!

@jling made me realize I was being stupid and should just index directly

@DNF made me realize that using StaticArrays for this kind of indexing thing is annoying, because one loses the ability to easily increment/decrement index - tuples are better here. StaticArrays shines very much in other parts of my code though

Kind regards