Function with array of matrices as input in Julia 0.5


#1

Been struggling with something for a while. I use a lot of arrays of matrices so I wanted to create a typealias for it like this:

typealias MatrixCell{T<:Number} Array{Matrix{T},1}

This way I can easily create an array of matrices of predefined length, for example

A=MatrixCell(2); A[1]=rand(4,4);A[2]=rand(2,2);

However, if I define a function like this:

function test{T<:Number}(A::MatrixCell{T})
       println(typeof(A));
       end

calling

test(A)

gives following error:

ERROR: MethodError: no method matching test(::Array{Array{T<:Number,2},1})
Closest candidates are:
  test{T<:Number}(::Array{Array{T<:Number,2},1}) at REPL[3]:2

Now this is really confusing, since the methods match.

I can work around by removing T<:Number from both MatrixCell and function defintion, but then the function does not work with arrays defined as

B=[rand(4,3),rand(3,3)]

Any ideas? Thanks!


#2

This is a corner-case of type-invariance with the current type system. You should find that it behaves as you expect if you give your MatrixCell a concrete element type:

A=MatrixCell{Float64}(2)

This is definitely tricky and I think it should be both less surprising and more obvious with the type-system revamp that’s slated for 0.6.


#3

OK, thanks for the reply. I just realized I can remove T<:Number from MatrixCell and the function and then define another method of the function to work with arrays defined as

B=[rand(4,3),rand(3,3)]

in the following way:

test{T<:Number}(A::Array{Matrix{T},1})=test(MatrixCell(A))

This way I have the function working for array of matrices defined both ways.
Sharing always helps :wink: