我为什么要用

X = randn(size(Y));


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

但不是
X = eye(size(Y));

?它引发以下错误,我不太了解:

最佳答案

错误



应该向您提示问题的性质。如有疑问,请查看函数的方法并检查类型是否与它们中的任何一个对齐。
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)

为什么eye(size(Y))不起作用?由于size返回一对,
julia> typeof(size(Y))
(Int64,Int64)

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

与柯里关系

您需要的是一个f函数,使得
f(eye)(size(Y))

相当于
eye(size(Y,1), size(Y,2))

您可以说f将是uncurry eye。对于您来说很不幸,Julia开发人员拥有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

09-05 00:00