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.

Cheers,
Alan



On 29 Sep 2015, at 15:11, Mauro <mauro...@runbox.com> wrote:

>> Thanks. The example was intended as an illustration of a more complex
>> code in which this was an issue. However, maybe i could do it without
>> the @generated.  I will revisit it and see if I really did need it...
> 
> 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.
> 
> 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