Thanks! 

So just to clarify, the difference between this code:

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




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] 
> <javascript:>> 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