On Sun, Dec 13, 2015 at 9:03 PM, Thomas Moore <[email protected]> wrote:
> 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

You only create two arrays in total and the original a is never
accessed after the first loop. Maybe think of julia arrays as more
efficient matlab cell arrays if that helps you understand the
schematics. (assuming I don't have any misunderstanding of the matlab
cell array.......)

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