Меня интересует простой способ строго определить вектор столбца в Юлии, например, я хочу вектор столбца из 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]
Но это слишком глупо.Есть ли лучший способ сделать это?