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.
>