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
>

Reply via email to