Есть ли способ объединить матрицу коэффициентов с матрицей переменных в Julia JuMP (поэлементное произведение двух массивов) - PullRequest
2 голосов
/ 31 марта 2020

У меня, по сути, есть целый ряд коэффициентов, которые я хочу связать с переменными другой матрицы, чтобы сэкономить время на выписывание ограничений.

Примерно так:

Матрица неизвестная операция

В Джулии я бы идеально хотел иметь возможность сказать что-то вроде этого:

@variable(model, x[1:9])
A = collect[1:9]
@constraint(model, A =? x[1:9])

С большим удовольствием!

1 Ответ

4 голосов
/ 31 марта 2020

Вы ищете поэлементное произведение двух массивов? Если это так, то оно обозначается .*, в соответствии с широко используемым в Юлии соглашением, что . обозначает «широковещание», то есть поэлементное применение функции к коллекции:

julia> x = 1 .+ 0.1*rand(3,3)
3×3 Array{Float64,2}:
 1.01642  1.01822  1.08074
 1.01375  1.01617  1.04618
 1.06083  1.09773  1.07278

julia> A = reshape(1:9, 3, 3)
3×3 reshape(::UnitRange{Int64}, 3, 3) with eltype Int64:
 1  4  7
 2  5  8
 3  6  9

julia> A.*x
3×3 Array{Float64,2}:
 1.01642  4.07288  7.56517
 2.0275   5.08086  8.36943
 3.18249  6.58637  9.65506

Обратите внимание, что вещание - это очень общая техника, которую вы можете использовать где угодно. И JuMP не исключение:

julia> using JuMP
julia> model = JuMP.Model()
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: NO_OPTIMIZER
Solver name: No optimizer attached.

julia> @variable(model, x[1:3,1:3])
3×3 Array{VariableRef,2}:
 x[1,1]  x[1,2]  x[1,3]
 x[2,1]  x[2,2]  x[2,3]
 x[3,1]  x[3,2]  x[3,3]

julia> A = reshape(1:9, 3, 3)
3×3 reshape(::UnitRange{Int64}, 3, 3) with eltype Int64:
 1  4  7
 2  5  8
 3  6  9

       # Note how both * and <= are broadcasted to be applied element-wise
julia> @constraint(model, con, A .* x .<= 1)
3×3 Array{ConstraintRef{Model,MathOptInterface.ConstraintIndex{MathOptInterface.ScalarAffineFunction{Float64},MathOptInterface.LessThan{Float64}},ScalarShape},2}:
 x[1,1] ≤ 1.0    4 x[1,2] ≤ 1.0  7 x[1,3] ≤ 1.0
 2 x[2,1] ≤ 1.0  5 x[2,2] ≤ 1.0  8 x[2,3] ≤ 1.0
 3 x[3,1] ≤ 1.0  6 x[3,2] ≤ 1.0  9 x[3,3] ≤ 1.0
...