# Changing content of an array via a function

Dear All,

I am trying to assign values to an array via an index shifting function for a particular reason, I was wondering if there is a way to achieve that in Julia. A simple example is

``````a = [1 2 3]
b = [0 0 0] # I want to assign the values of a into b
b_shift(i) = b[i+1] # this shifts the index of b to a zero based index
for i in 0:2
b_shift(i) = a[i+1]
# of course, the straight forward way would be b[i+1] = a[i+1],
# but I need a index shifter operation for my purpose
println(b_shift(i)) # output is 1 2 3
end

println(b) # output is [0 0 0], so b did not change
``````

Is there a way I can turn `b=a` via the `b_shift` function? Any tips will be appreciated!

Note that `b_shift(i) = b[i+1]` defines a function that takes the integer `i` and returns `b[i+1]`. But then in your for loop, you have `b_shift(i) = a[i+1] ` which is simply just overwriting the function definition (I believe you this is assigning the value of `a[i+1]` to the `b` shifted vector… its not). In order for you to do what you are doing, you’ll need some more machinery by overloading `setindex` and `getindex` functions.

If you want to use a 0-based vector, the best solution would be to use the package `OffsetArrays`.

``````using OffsetArrays
a = [1 2 3]
b = [0 0 0] # I want to assign the values of a into b

# create the offsets  -- note these are by reference. so modifying a_offset also modifies a
a_offset = OffsetArray(a, 0:2)
b_offset = OffsetArray(b, 0:2)
for i in 0:2
b_offset[i] = a_offset[i] # will modify the original `b` as well.
end
``````
3 Likes

Thanks so much, @affans, your solution works great for my purpose!