3

我对 Julia 完全陌生(今天早些时候才开始),所以如果这是一个愚蠢的问题,请原谅我,但是尽管喜欢这种语言,但我并没有找到很多很好的调试帮助。

基本上,我只想为一个方法定义一个备用构造函数,该方法将在输入包含任何类型整数(int32、uint8 等)的数组时激活。

我认为这会相对简单,并写了以下内容:

type MyType
    weight_matrices::Array{Array{FloatingPoint}}

    MyType(layer_sizes::Array{Integer}) =
        new([
            rand(layer_sizes[i], layer_sizes[i+1]) for i in [1:length(layer_sizes)-1]
        ])
end

但是当我尝试使用它时:

test = MyType([1,2,1])

我得到错误:

ERROR: no method MyType(Array{Int64, 1})

正如人们所假设的那样,将备用构造函数从 切换Array{Integer}Array{Int64}可以解决问题,但我不想将使用限制到那么远。

关于如何做到这一点的任何想法?任何代码审查也将不胜感激。我认为这段代码不是很“朱利安”(那是一回事吗?),并且会喜欢指针以使其对其他人更有用。

4

1 回答 1

0

这有效:

type MyType     
       weight_matrices::Array{Array{FloatingPoint}}

       MyType(layer_sizes::Array{Int}) =
           new([
               rand(layer_sizes[i], layer_sizes[i+1]) for i in [1:length(layer_sizes)-1]
           ])
   end

julia> test = MyType([1,2,1])
MyType([
1x2 Array{FloatingPoint,2}:
 0.477698  0.454376,

2x1 Array{FloatingPoint,2}:
 0.318465
 0.280079])

Julia 容器不是协变或反变的,因此[1,2,1],它是一个具体类型的数组,Int不是抽象类型数组的子类型Integer

(注意,Int 是您的本机整数类型的别名,在 64 位机器上是 Int64,在 32 位机器上是 Int32)

如果你真的希望你的输入是不同类型的整数,那么参数化输入的类型(使用外部构造函数)

type MyType                                
       weight_matrices::Array{Array{FloatingPoint}}
end

MyType{T<:Integer}(layer_sizes::Array{T}) =
           MyType([rand(layer_sizes[i], layer_sizes[i+1]) for i in                   [1:length(layer_sizes)-1]])

julia> test = MyType([1,2,1])
MyType([
 1x2 Array{FloatingPoint,2}:
 0.28085  0.10863,

2x1 Array{FloatingPoint,2}:
 0.245685
 0.277009])
于 2014-02-11T17:10:17.607 回答