Note that generated function are not generally needed for that, as Tim Holy pointed out yesterday in https://groups.google.com/d/msg/julia-users/iX-R5luh-0M/QUeBXBLxBwAJ. That also help avoid the downside of generated functions (they are hard to write correctly, hard to read, slow for dispatch, may be bad for type-inference, and have very high static memory usage).
On Tue, Sep 29, 2015 at 10:44 AM Mauro <mauro...@runbox.com> wrote: > > Thanks Mauro - really useful to know. So it seems that in this > > particular instance the number of nested loops does change with N, so > > I think the code would fall into the latter case. > > Sorry, I wasn't clear: no, only the number of iterations would change. > With numbers of nested loops I meant, say two: > > for i=1:n > for j=1:m > ... > end > end > > to three > > for i=1:n > for j=1:m > for k=1:l > ... > end > end > end > > which could be done with a generated function (look for Base.Cartesian). > > >> Well, it is always hard to tell what's best. If you need certainty, > >> then you need to benchmark. Note that in below example, Julia will > >> compile a specialized version of the function for each NTuple anyway. > >> This may be good or bad, depending on how much time compilation vs > >> running takes. > > And above was also not clear, I should have written: > > "Note that in MY example below, Julia will compile a specialized version > of the function for each NTuple with a different N anyway." > > >> A case for a generated function would be if, say, the number of nested > >> loops would change depending on some parameter, say the dimensionality > >> of an array. > >> > >>> Thanks, Alan > >>> > >>> > >>> was just an illustration of a the larger piece of code where I am > making using > >>> On 29 Sep 2015, at 13:48, Mauro <mauro...@runbox.com> wrote: > >>> > >>>> I don't think that you need nor that you should use generated > functions. > >>>> But maybe I'm wrong, what are you trying to achieve? This should work > >>>> as you want: > >>>> > >>>> function testfun2!{N}(X,Y::NTuple{N,Float64}) > >>>> for i in eachindex(X), j in 1:N # much better to have the loop this > way > >>>> X[i][j] = Y[j] > >>>> end > >>>> return X > >>>> end > >>>> > >>>> # Setup for function call > >>>> InnerArrayPts = 3 > >>>> OuterArrayPts = 10 > >>>> Xinput = [Array{Float64}(InnerArrayPts) for r in 1:OuterArrayPts] > >>>> Yinput = rand(InnerArrayPts) > >>>> > >>>> testfun2!(Xinput,tuple(Yinput...)) > >>>> > >>>> On Tue, 2015-09-29 at 13:20, Alan Crawford <a.r.crawf...@gmail.com> > wrote: > >>>>> I would like to preallocate memory of an array of arrays and pass it > to a > >>>>> function to be filled in. I have created an example below that > illustrates > >>>>> my question(s). > >>>>> > >>>>> Based on my (probably incorrect) understanding that it would be > desirable > >>>>> to fix the type in my function, I would like to be able to pass my > array of > >>>>> arrays, X, in a type stable way. However, I can't seem to pass > >>>>> Array{Array{Float64,N},1}. If, however, i do not attempt to impose > the type > >>>>> on the function, it works. > >>>>> > >>>>> Is there a way to pass Array{Array{Float64,N},1 to my function? Do I > even > >>>>> need to fix the type in the function to get good performance? > >>>>> > >>>>> # version of Julia: 0.4.0-rc3 > >>>>> > >>>>> @generated function > >>>>> testfun1!{N}(X::Array{Array{Float64,1},1},Y::NTuple{N,Float64}) > >>>>> quote > >>>>> for j in 1:$N, i in eachindex(X) > >>>>> X[i][j] = Y[j] > >>>>> end > >>>>> return X > >>>>> end > >>>>> end > >>>>> > >>>>> @generated function testfun2!{N}(X,Y::NTuple{N,Float64}) > >>>>> quote > >>>>> for j in 1:$N, i in eachindex(X) > >>>>> X[i][j] = Y[j] > >>>>> end > >>>>> return X > >>>>> end > >>>>> end > >>>>> > >>>>> # Setup for function call > >>>>> InnerArrayPts = 3 > >>>>> OuterArrayPts = 10 > >>>>> Xinput = [Array{Float64}(InnerArrayPts) for r in 1:OuterArrayPts] > >>>>> Yinput = rand(InnerArrayPts) > >>>>> > >>>>> # Method Error Problem > >>>>> testfun1!(Xinput,tuple(Yinput...)) > >>>>> > >>>>> # This works > >>>>> testfun2!(Xinput,tuple(Yinput...)) > >>>>> > >>>>> I also tried with the following version of testfun1!() and again got > a > >>>>> method error. > >>>>> > >>>>> @generated function > >>>>> testfun1!{N}(X::Array{Array{Float64,N},1},Y::NTuple{N,Float64}) > >>>>> quote > >>>>> for j in 1:$N, i in eachindex(X) > >>>>> X[i][j] = Y[j] > >>>>> end > >>>>> return X > >>>>> end > >>>>> end > >>>>> > >>>>> > >>>>> I am sure i am misunderstanding something quite fundamental and/or > missing > >>>>> something straightforward... > >>>>> > >>>>> Thanks, > >>>>> Alan >