在 Julia 中严格定义列向量(具有一列的矩阵)
To strictly define a column vector (matrix with one column) in Julia
我想知道在 Julia 中严格定义列向量的简单方法,例如,我想要一个 3 行列向量 B
:
julia> columnVectorB
3×1 Array{Float64,2}:
1.0
2.0
3.0
虽然我认为正常的方式是:
julia> columnVectorB = [1.; 2.; 3.]
julia> columnVectorB
3-element Array{Float64,1}:
1.0
2.0
3.0
我必须这样做的原因是,如果在 JuMP 中使用矩阵操作时以正常方式定义列向量,则会出现烦人的问题。问题之一是:
julia> using JuMP
julia> using GLPKMathProgInterface
julia> n = 1
julia> model_mas = Model(solver = GLPKSolverLP())
julia> @variable(model, vec_y[1: n] >= 0, Int)
julia> vec_y
1-element Array{Variable,1}:
vec_y[1]
n
表示vec_y
可以是n个变量的列向量。也是B
的列数,所以B
实际上是一个矩阵。当n > 1
时,没有问题。当n = 1
时,B
成为列向量。那么,就会出现问题:
julia> @constraint(model, (columnVectorB * vec_y)[1] <= 10)
ERROR: MethodError: no method matching *(::Array{Float64,1}, ::Array{Variable,1})
Closest candidates are:
*(::Any, ::Any, ::Any, ::Any...) at operators.jl:502
*(::LinearAlgebra.Adjoint{#s45,#s44} where #s44<:SparseArrays.SparseMatrixCSC where #s45<:Union{AbstractJuMPScalar, GenericNormExpr{2,Float64,Variable}, NonlinearExpression, GenericNorm{P,Float64,Variable} where P}
目前,我通过以下方式解决问题:
julia> columnVectorB = rand(3,1)
julia> columnVectorB[1] = 1.
julia> columnVectorB[2] = 2.
julia> columnVectorB[3] = 3.
julia> columnVectorB
3×1 Array{Float64,2}:
1.0
2.0
3.0
julia> columnVectorB * vec_y
3-element Array{JuMP.GenericAffExpr{Float64,Variable},1}:
1 vec_y[1]
2 vec_y[1]
3 vec_y[1]
但这也太蠢了吧。有没有更好的方法来做到这一点?
实际上,您似乎想要一个只有一列和 n
行的 矩阵。您可以通过多种方式将 向量 转换为矩阵。我给你几个选择:
julia> x = [1,2,3] # a vector
3-element Array{Int64,1}:
1
2
3
julia> hcat(x) # a matrix
3×1 Array{Int64,2}:
1
2
3
julia> reshape(x, :, 1) # a matrix
3×1 Array{Int64,2}:
1
2
3
julia> x[:,:] # a matrix
3×1 Array{Int64,2}:
1
2
3
EDIT 在这三个中 reshape
将是最快的,因为它不执行复制(reshape
的结果将共享底层x
) 的数据。 hcat
和 [:,:]
都将执行数据的复制。
我想知道在 Julia 中严格定义列向量的简单方法,例如,我想要一个 3 行列向量 B
:
julia> columnVectorB
3×1 Array{Float64,2}:
1.0
2.0
3.0
虽然我认为正常的方式是:
julia> columnVectorB = [1.; 2.; 3.]
julia> columnVectorB
3-element Array{Float64,1}:
1.0
2.0
3.0
我必须这样做的原因是,如果在 JuMP 中使用矩阵操作时以正常方式定义列向量,则会出现烦人的问题。问题之一是:
julia> using JuMP
julia> using GLPKMathProgInterface
julia> n = 1
julia> model_mas = Model(solver = GLPKSolverLP())
julia> @variable(model, vec_y[1: n] >= 0, Int)
julia> vec_y
1-element Array{Variable,1}:
vec_y[1]
n
表示vec_y
可以是n个变量的列向量。也是B
的列数,所以B
实际上是一个矩阵。当n > 1
时,没有问题。当n = 1
时,B
成为列向量。那么,就会出现问题:
julia> @constraint(model, (columnVectorB * vec_y)[1] <= 10)
ERROR: MethodError: no method matching *(::Array{Float64,1}, ::Array{Variable,1})
Closest candidates are:
*(::Any, ::Any, ::Any, ::Any...) at operators.jl:502
*(::LinearAlgebra.Adjoint{#s45,#s44} where #s44<:SparseArrays.SparseMatrixCSC where #s45<:Union{AbstractJuMPScalar, GenericNormExpr{2,Float64,Variable}, NonlinearExpression, GenericNorm{P,Float64,Variable} where P}
目前,我通过以下方式解决问题:
julia> columnVectorB = rand(3,1)
julia> columnVectorB[1] = 1.
julia> columnVectorB[2] = 2.
julia> columnVectorB[3] = 3.
julia> columnVectorB
3×1 Array{Float64,2}:
1.0
2.0
3.0
julia> columnVectorB * vec_y
3-element Array{JuMP.GenericAffExpr{Float64,Variable},1}:
1 vec_y[1]
2 vec_y[1]
3 vec_y[1]
但这也太蠢了吧。有没有更好的方法来做到这一点?
实际上,您似乎想要一个只有一列和 n
行的 矩阵。您可以通过多种方式将 向量 转换为矩阵。我给你几个选择:
julia> x = [1,2,3] # a vector
3-element Array{Int64,1}:
1
2
3
julia> hcat(x) # a matrix
3×1 Array{Int64,2}:
1
2
3
julia> reshape(x, :, 1) # a matrix
3×1 Array{Int64,2}:
1
2
3
julia> x[:,:] # a matrix
3×1 Array{Int64,2}:
1
2
3
EDIT 在这三个中 reshape
将是最快的,因为它不执行复制(reshape
的结果将共享底层x
) 的数据。 hcat
和 [:,:]
都将执行数据的复制。