为什么eye(size(X))(其中X是某个数组)会抛出错误?

时间:2015-04-14 18:27:32

标签: methods julia

为什么我可以使用

X = randn(size(Y));

X = eye(size(Y,1), size(Y,2));

但不是

X = eye(size(Y));

?它抛出以下错误,我不太明白:

  

错误:eye没有匹配eye(::(Int64,Int64))

的方法

1 个答案:

答案 0 :(得分:8)

错误

  

错误:eye没有匹配eye(::(Int64,Int64))

的方法

应该告诉你问题的本质。如有疑问,请查看函数的方法,并检查类型是否与其中任何一个对齐。

eye方法

您可以通过调用eye列出为methods提供的方法:

julia> methods(eye)
# 7 methods for generic function "eye":
eye{T}(::Type{Diagonal{T}},n::Int64) at linalg/diagonal.jl:92
eye(T::Type{T<:Top},m::Integer,n::Integer) at array.jl:176
eye(m::Integer,n::Integer) at array.jl:182
eye(T::Type{T<:Top},n::Integer) at array.jl:183
eye(n::Integer) at array.jl:184
eye(S::SparseMatrixCSC{Tv,Ti<:Integer}) at sparse/sparsematrix.jl:413
eye{T}(x::AbstractArray{T,2}) at array.jl:185

类型是否对齐?

首先,让我们生成一些随机数据:

julia> Y=rand(3,3)
3x3 Array{Float64,2}:
 0.323068  0.759352   0.684859
 0.357021  0.0706659  0.78324 
 0.128993  0.763624   0.458284

那么,为什么eye(size(Y,1), size(Y,2))有效?因为size(Y,1)size(Y,2)都属于Int64类型,

julia> typeof(size(Y,1))
Int64

julia> typeof(size(Y,2))
Int64

Integer的子类型,

julia> Int64 <: Integer
true

eye提供了一种方法,它需要两个类型为Integer的参数:

eye(m::Integer,n::Integer)

为什么&#39; t eye(size(Y))有效?因为size会返回一对,

julia> typeof(size(Y))
(Int64,Int64)

eye没有提供将对作为参数的方法。

与currying的关系

您需要的是一个函数f,以便

f(eye)(size(Y))

等同于

eye(size(Y,1), size(Y,2))

你可以说funcurry eye。不幸的是,朱莉娅开发者有no plans to introduce such a function

解决方案

无论如何,你过度复杂了。这里没有必要使用size;只需将eye应用于数组Y即可生成所需的结果:

julia> eye(Y)
3x3 Array{Float64,2}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0