Thanks for the explanations.

To me this seems now reasonable, after realizing that in Julia not only 
reshape etc, but already the normal assignment b=a (for a an array) opens 
for the same kind of "surprises" as I had noticed them with reshape. Coming 
from Matlab this is a surprise, but for someone being familiar with certain 
other languages, I guess, it is not?

 julia> a=[1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> b=a;

julia> b[2]=0
0

julia> a
3-element Array{Int64,1}:
 1
 0
 3

But then "+-" is different again:

julia> b+=1;

julia> a
3-element Array{Int64,1}:
 1
 0
 3


Perhaps one could add 
in http://julia.readthedocs.org/en/latest/manual/noteworthy-differences/ 
under Matlab near the top something like:

* Arrays are mutable. Assignments like b=a and functions b=f(a) behave in 
Matlab always equivalent to b=copy(a) and b=f(copy(a)), but in Julia b 
becomes conceptually a pointer or different view of the contents of a. The 
values of a can be altered through b.

PS: Yes, linear indices work directly also in Julia, I had overlooked this

Am Montag, 13. Oktober 2014 10:33:26 UTC+2 schrieb Jutho:
>
> Some more comments / answers:
>
> I too was confused by the precise use of ! when I first started using 
> Julia in cases like reshape. However, it is very clear that reshape should 
> not have an exclamation mark.
>
> The use of ! in Julia functions is whenever the function modifies one of 
> its input arguments. This can be for several reasons:
>
>    1. The function performs some operation in-place: e.g. 
>    scale!(A,lambda) multiplies all elements of the array A with the scalar 
>    lambda in place.
>    2. The operation stores the result of the computation in one 
>    (typically the first) argument: e.g. copy!(B,A), permutedims!(B,A,perm), 
>    scale!(B,A,lambda), Base.transpose!(B,A): do something with the data of A 
>    and store the result in the pre-allocated but not necessarily initialised 
>    array B
>    3. The function overwrites the input arguments for use as temporary 
>    workspace, but the actual result is just a normal return value as in 
>    typical functions: e.g. the different [eig,svd,qr]fact!(A) methods
>
> The Base.LinAlg.BLAS methods do something in between 1. and 2.; they store 
> the result of the computation in a dedicated 'output' argument as in 2., 
> but they can also just add the result to that output argument, in which 
> case it needs to be correctly initialised.
>
> In summary, the exclamation mark means that if you need the original 
> values of all of the arguments after calling he function, you should better 
> make a copy, since calling the function allows it to destroy the original 
> values of its arguments (only possible with arrays or other mutable types).
> Also note that most of these functions do not change the size of array 
> arguments, resize! is one of the notable few exceptions and only works with 
> one-dimensional arrays (vectors).
>
> reshape doesn't fit in any of these categories. B=reshape(A,newsize) does 
> not destroy the values of a. It is however true that the output B shares 
> data with A, just like if you do B=slice(A,...) or B=sub(A,...). Note that 
> none of these functions use an exclamation mark, nor is there any other 
> stylistic convention to indicate that this happens. That's just a new 
> aspect of the language that you have to take into account when coming from 
> e.g. Matlab, but that is very natural when coming from e.g. C.
>
> Finally, note that linear indexing indeed works on an array without 
> reshaping, but that if you want the 'vectorized' version a multidimensional 
> array, there is the build in function B=vec(A), which is indeed equivalent 
> to B=reshape(A,prod(size(A)))
>
>
>
>
> Op zaterdag 11 oktober 2014 22:20:13 UTC+2 schreef Stephan Buchert:
>>
>> julia> a=[1 2; 3 4; 5 6]
>> 3x2 Array{Int64,2}:
>>  1  2
>>  3  4
>>  5  6
>>
>> julia> b=reshape(a, prod(size(a)));
>>
>> julia> b[3]=0
>> 0
>>
>> julia> a
>> 3x2 Array{Int64,2}:
>>  1  2
>>  3  4
>>  0  6
>>
>>

Reply via email to