For some of your cases, copy!(t, a) or fill!(t, 1.0+2.0) may be what you want. --Tim
On Thursday, October 23, 2014 01:58:48 AM [email protected] wrote: > > Those coming to Julia from languages like Python, R, Matlab/Octave, etc. > > have it ingrained in them to "fear the loop" and to perform loop-like > > calculations in "verbose and convoluted" ways. > > Please compare my Python version with yours. If I look at the Python > version in 2 month, I'll immediately understand what it does and what it is > used for, yours is not as straight forward. > > But I'm really not complaining. I was just surprised that I couldn't > decrease the allocation. I still don't understand why t[1] = 1.0+2.0 > allocates nothing, while t[:] = 1.0+2.0 allocates things. > > > It is actually quite easy to do this calculation in Julia with very > > > > little storage allocation by writing three nested loops. > > > > function mindist(pos::Matrix{Float64}, Acp::Matrix{Float64}) > > > > m,n = size(pos) > > r,s = size(Acp) > > m == r || throw(DimensionMismatch("")) > > res = fill(Inf,(n,)) > > for i in 1:n > > > > for j in 1:s > > > > sm = 0. > > for k in 1:m > > > > sm += abs2(pos[k,i] - Acp[k,j]) > > > > end > > if sm < res[i] > > > > res[i] = sm > > > > end > > > > end > > > > end > > res > > > > end > > > > On my machine timing the second execution (the first execution includes > > compile time) I get > > > > julia> @time mindist(pos,Acp); > > elapsed time: 0.002806999 seconds (744 bytes allocated) > > Thank you. Very good ideas there also. > > > Just a last related question: is there any way in Julia to work on complete > vector/matrices (without unrolling) without allocating stuff? For instance > > t = zeros(Float64, 3) > a = rand(Float64, 3) > b = rand(Float64, 3) > > t[:] = a[:] > t[:] .*= b[:] > > but without allocation? @devec reduces it by half but it's still not zero. > There might be no better alternative yet.
