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

Why does eye(size(X)) (where X is some array) throw an error?

为什么我可以使用

X = randn(size(Y));

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

但不是

X = eye(size(Y));

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

ERROR: eye has no method matching eye(::(Int64,Int64))

错误

ERROR: eye has no method matching eye(::(Int64,Int64))

应该向您提示问题的性质。如有疑问,请查看函数的方法并检查类型是否与其中任何一个一致。

eye 方法

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

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)

为什么 eye(size(Y)) 不起作用?因为sizereturns一对,

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

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

与柯里化的关系

你需要的是一个函数 f 这样

f(eye)(size(Y))

相当于

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

你可以说 funcurry eye. Unfortunately for you, the Julia devs have 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