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.
