复制构造函数以创建一个单元素向量矩阵
Copy constructor to create a one element Matrix of Vectors
在 Julia 中,以下工作:
julia> A = Matrix{Vector{Float64}}([[[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]] [[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]]])
5×2 Array{Array{Float64,1},2}:
[-3.0, 4.0] [-3.0, 4.0]
[8.0] [8.0]
[7.0, 8.0] [7.0, 8.0]
[0.0, 9.0] [0.0, 9.0]
[-1.0] [-1.0]
这将创建一个包含两个相同列的 Matrix{Vector{Float64}}
。
但是,使用相同的模式创建相同的对象但只有一列 returns 会出错:
julia> A = Matrix{Vector{Float64}}([[[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]]])
这怎么可能,我该如何解决?
从我的角度来看,我目前的解决方法并不令人满意,因为它使用了 hcat
,是:
julia> A = hcat(Matrix{Vector{Float64}}(undef, 5, 0), [[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]])
5×1 Array{Array{Float64,1},2}:
[-3.0, 4.0]
[8.0]
[7.0, 8.0]
[0.0, 9.0]
[-1.0]
首先,没有必要将类型声明放在数组前面。随便写
A = [[[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]] [[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]]]
这是一个Array{Array{Float64,1},2}
如果你第二次尝试做同样的事情,你会得到非常不同的东西:
julia> [[[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]]]
1-element Array{Array{Array{Float64,1},1},1}
这是一个数组的数组。不是你想要的开始。
不幸的是,解决这个问题没有帮助。原因是你不能简单地将向量转换为矩阵,即使它们没有嵌套:
julia> Matrix{Float64}([1.0,2.0,3.0])
ERROR: MethodError: no method matching Array{Float64,2}(::Array{Float64,1})
错误信息很清楚。
创建 Nx1 矩阵实际上非常困难,但是您可以使用重塑:
julia> reshape([[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]], :, 1)
5×1 Array{Array{Float64,1},2}:
[-3.0, 4.0]
[8.0]
[7.0, 8.0]
[0.0, 9.0]
[-1.0]
请记住,您通常不需要将数组文字传递给构造函数。 Julia 自己找出类型。
在 Julia 中,以下工作:
julia> A = Matrix{Vector{Float64}}([[[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]] [[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]]])
5×2 Array{Array{Float64,1},2}:
[-3.0, 4.0] [-3.0, 4.0]
[8.0] [8.0]
[7.0, 8.0] [7.0, 8.0]
[0.0, 9.0] [0.0, 9.0]
[-1.0] [-1.0]
这将创建一个包含两个相同列的 Matrix{Vector{Float64}}
。
但是,使用相同的模式创建相同的对象但只有一列 returns 会出错:
julia> A = Matrix{Vector{Float64}}([[[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]]])
这怎么可能,我该如何解决?
从我的角度来看,我目前的解决方法并不令人满意,因为它使用了 hcat
,是:
julia> A = hcat(Matrix{Vector{Float64}}(undef, 5, 0), [[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]])
5×1 Array{Array{Float64,1},2}:
[-3.0, 4.0]
[8.0]
[7.0, 8.0]
[0.0, 9.0]
[-1.0]
首先,没有必要将类型声明放在数组前面。随便写
A = [[[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]] [[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]]]
这是一个Array{Array{Float64,1},2}
如果你第二次尝试做同样的事情,你会得到非常不同的东西:
julia> [[[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]]]
1-element Array{Array{Array{Float64,1},1},1}
这是一个数组的数组。不是你想要的开始。
不幸的是,解决这个问题没有帮助。原因是你不能简单地将向量转换为矩阵,即使它们没有嵌套:
julia> Matrix{Float64}([1.0,2.0,3.0])
ERROR: MethodError: no method matching Array{Float64,2}(::Array{Float64,1})
错误信息很清楚。
创建 Nx1 矩阵实际上非常困难,但是您可以使用重塑:
julia> reshape([[-3.0,4.0],[8.0],[7.0, 8.0],[0.0,9.0],[-1.0]], :, 1)
5×1 Array{Array{Float64,1},2}:
[-3.0, 4.0]
[8.0]
[7.0, 8.0]
[0.0, 9.0]
[-1.0]
请记住,您通常不需要将数组文字传递给构造函数。 Julia 自己找出类型。