On Sun, Dec 13, 2015 at 9:14 PM, Thomas Moore <[email protected]> wrote:
> Thanks! That works fine.
>
> I must admit, this is all a bit novel for me :) Is my understanding of the
> difference between the following two pieces of code correct:
>
> astore = []
> a = [1,2]
> b = similar(a)
> for j = 1:5
>
>
>   for i = eachindex(a)
>     ai = a[i]
>     b[i] = ai + 1
>   end
>   a = b
>   push!(astore,a);
>   println(astore)
> end
>
> and this code
>
> astore = []
> a = [1,2]
>
> for j = 1:5
>   b = similar(a)
>
>   for i = eachindex(a)
>     ai = a[i]
>     b[i] = ai + 1
>   end
>   a = b
>   push!(astore,a);
>   println(astore)
> end
>
>
> The first thing we do in the first piece of code is we create a vector b.
> Then we assign (by reference) that a = b, so any changes in b automatically
> flow through to a and, in turn, astore. Thus each loop we change b, and thus
> a, and thus all references to a in astore change.
>
> In the second piece of code, we create a *new* vector b each time. We then
> modify b slightly, and declare a *new* reference a = b. The old values of a
> in astore are now not pointing to the current 'a', but to an older version
> of 'a' (which in turn is another version of 'b' from a previous iteration
> that is still being held in memory.).
>
> Is that correct?

That's right. If you are familiar with pointers then you can think of
all julia variables as pointers to the actual object. You can print
the `id()` of the objects to observe this yourself.

>
> Thanks
> Tom
>
> On Monday, 14 December 2015 11:22:20 UTC+11, Yichao Yu wrote:
>>
>> On Sun, Dec 13, 2015 at 6:59 PM, Thomas Moore <[email protected]> wrote:
>> > Hi,
>> >
>> > Your explanation makes sense, but, coming from MATLAB, I must admit I'm
>> > not
>> > familiar with the numerical values of a particular array (in this case
>> > astore) changing when another variable (in this case a) is changed. I
>> > hope
>> > you don't mind a few follow-up questions :)
>> >
>> >  - Is this behaviour explained somewhere in the Julia docs so people can
>> > clearly know which operations create a new array (as in my first
>> > example)
>> > and which operations modify the values of an existing array (as in the
>> > second example)?
>>
>> I don't know if your problem is emphasized enough but the doc for the
>> difference between matlab and julia mentioned that assignments are
>> always by reference[1] an modifying a object (setindex) will show up
>> in all variables referencing it.
>>
>> [1]
>> http://julia.readthedocs.org/en/latest/manual/noteworthy-differences/?highlight=matlab#noteworthy-differences-from-matlab
>>
>> >  - Is there a 'Julian' way of getting the result of my first example
>> > while
>> > changing individual elements of 'a' as I've done in the second example?
>> > In
>> > each loop I want to change particular values a[i], and then statically
>> > store
>> > the numerical value of a in astore, before commencing to the next
>> > iteration
>>
>> If all what you do is a simple +1 and the first version is the right
>> way to do it. If you are doing more complicated things on each
>> element, you may consider "devectorize" it in order to avoid allocate
>> a lot of intermediates.
>>
>> e.g.
>>
>> b = similar(a)
>> @inbounds for i in eachindex(a)
>>     ai = a[i]
>>     b[i] = ai * (ai + 1) + sin(ai) - sqrt(ai) # or whatever you want
>> end
>> a = b
>>
>> > - is there a way to easily do this in Julia?
>>
>> See above.
>>
>> >
>> > Thanks
>> >
>> > On Friday, 11 December 2015 17:07:42 UTC+11, [email protected] wrote:
>> >>
>> >> Looks right to me.
>> >>
>> >> In the first version `a = a + 1` makes `a` refer to a *new* array with
>> >> values one greater and `push!(astore,a)` stores the reference to the
>> >> new
>> >> array in `astore`.
>> >>
>> >> In the second version you modify the values of the array already
>> >> referred
>> >> to by `a` and then push a reference to that array, but every time you
>> >> push
>> >> it is a reference to the same array, so in the end all you have is lots
>> >> of
>> >> references to the same array.

Reply via email to