Hello!
I think I am just not finding the right command, but how to increment a CartesianIndex? I have a matrix of size 5x5. Suppose I have a cartesian index of CartesianIndex(3,1)
how to increment it to CartesianIndex(4,1)
based on the information of matrix size?
Kind regards
mkitti
March 18, 2024, 10:20pm
2
julia> CartesianIndex(3,1)+CartesianIndex(1,0)
CartesianIndex(4, 1)
1 Like
Depends on what you mean by “increment”, but you can also use nextind
to get the next (consecutive) index in a given array:
julia> A = rand(5,5);
julia> nextind(A, CartesianIndex(3,1))
CartesianIndex(4, 1)
(Better documentation for this was recently merged: Document the generic functions nextind() and prevind() by JamesWrigley · Pull Request #52658 · JuliaLang/julia · GitHub )
5 Likes
That is extremely close to what I want. I notice that it does not error out though:
julia> A = zeros(5,5)
5Ă—5 Matrix{Float64}:
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
julia> nextind(A, CartesianIndex(4,1))
CartesianIndex(5, 1)
julia> nextind(A, CartesianIndex(4,1))
CartesianIndex(5, 1)
julia> nextind(A, CartesianIndex(5,5))
CartesianIndex(1, 6)
julia> nextind(A, CartesianIndex(5,6))
CartesianIndex(1, 7)
julia> nextind(A, CartesianIndex(5,7))
CartesianIndex(1, 8)
I would like it to throw nothing
or return the same value when doing 5,5 since it is last element.
Kind regards
Then you can use iterate
with CartesianIndices(A)
:
julia> I = CartesianIndices(A)
CartesianIndices((5, 5))
julia> iterate(I, CartesianIndex(4,1))
(CartesianIndex(5, 1), CartesianIndex(5, 1))
julia> iterate(I, CartesianIndex(5,4))
(CartesianIndex(1, 5), CartesianIndex(1, 5))
julia> iterate(I, CartesianIndex(4,5))
(CartesianIndex(5, 5), CartesianIndex(5, 5))
julia> iterate(I, CartesianIndex(5,5)) # last index, returns nothing
(When it doesn’t return nothing
, it returns the same index twice due to the iterate
API, but you can just ignore the second return value and the compiler should eliminate it.)
5 Likes