Чтобы строго определить вектор-столбец (матрицу с одним столбцом) в Julia

Меня интересует простой способ строго определить вектор-столбец в Julia, например, мне нужен трехстрочный вектор-столбец 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]

Но это слишком глупо. Есть ли лучший способ сделать это?


person edxu96    schedule 16.03.2019    source источник


Ответы (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

РЕДАКТИРОВАТЬ Из этих трех reshape будет самым быстрым, поскольку он не выполняет копирование (результат reshape будет передавать базовые данные x). hcat и [:,:] будут выполнять копирование данных.

person Bogumił Kamiński    schedule 16.03.2019
comment
Да, именно это я имел в виду. Спасибо - person edxu96; 16.03.2019