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...

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