Unfortunately, I'm pretty sure you can't do what you're hoping for. Consider:
julia> A = rand(2,2)
2x2 Array{Float64,2}:
0.63259 0.109017
0.667425 0.112597
julia> pointer(A)
Ptr{Float64} @0x000000000446f6a0
julia> A *= 2
2x2 Array{Float64,2}:
1.26518 0.218033
1.33485 0.225195
julia> pointer(A)
Ptr{Float64} @0x0000000005696650
I think A *= 2 gets translated by the parser into A = A*2. There are some old
posts that can do a better job than I explaining why this is important.
So I think your only bet is to do something like this:
for i = 1:length(A)
A[i] *= 2
end
which does work in-place.
--Tim
On Wednesday, February 19, 2014 11:26:48 AM Madeleine Udell wrote:
> Currently in-place arithmetic operations turn shared arrays into normal
> ones: eg
>
> b = Base.shmem_randn(10)
> b *= 2
>
> results in b becoming a (not-shared) array. I'd like to overload these
> in-place arithmetic operations so that instead of writing
>
> typeof(b)==SharedArray? b.s *= 2 : b *= 2
>
> I can just write
>
> b *= 2
>
> and know that the shared status of my array will be preserved. How might
> one overload these operations?
>
> (Note: I don't want c = b + b to automatically create a shared array c,
> since that allocates new shared memory.)