Thanks Tomas, works perfectly.

I was testing out some code in the REPL... Relatedly and without abusing 
the thread too much, I wondered if you might be able to help me understand 
why the setting InnerArrayPts as const created the desired type stable 
array comprehension? Namely,

const InnerArrayPts1 = 3 
OuterArrayPts = 10
Xinput1 = [Array(Float64,InnerArrayPts1) for r in 1:OuterArrayPts]

Cheers
Alan



On Tuesday, 29 September 2015 12:28:36 UTC+1, Tomas Lycken wrote:
>
> If you’re trying this out in the REPL, you might have stumbled on the fact 
> that list comprehensions currently aren’t type stable, unless you tell 
> Julia the type of the elements. So instead of Xinput = 
> [Array{Float64}(InnerArrayPts) for r in 1:OuterArrayPts] in your setup, 
> do Xinput = Vector{Float64}[Array(Float64, InnerArrayPts) for r in 
> 1:OuterArrayPts] (I also switched which array constructor you use, but 
> that shouldn’t matter - it’s just a question of style, which is subjective 
> :) ).
>
> Note that Vector{Float64} is just a type alias for Array{Float64, 1}.
>
> // T
>
> On Tuesday, September 29, 2015 at 1:20:02 PM UTC+2, Alan Crawford 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