Матрично-векторное произведение в целевой функции JuMP, где матрица является переменной - PullRequest
1 голос
/ 15 апреля 2020

Я пишу программу оптимизации в Юлии, используя JuMP. Моя версия Julia 1.3.1, версия JuMP 0.21.2.

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

using JuMP
using LinearAlgebra

c1H = Vector(1:3)

model = Model()
@variable(model, GiH[1:10, 1:3] >= 0)

test = rand(10,3)

В целевой функции я умножаю матрицу на вектор (параметра), а затем суммирую записи результирующих записей. Я хочу написать это так:

@objective(model, Min, sum(GiH*c1H))

, что эквивалентно

@objective(model, Min, ones(10)'*(GiH*c1H))

Это нормально работает, когда я заменяю матрицу переменных на матрицу чисел test. Однако я с переменной матрицей GiH получаю ошибку

MethodError: no method matching similar(::Array{Float64,1}, ::Type{GenericAffExpr{Float64,VariableRef}}, ::Array{Int64,1})
Closest candidates are:
  similar(::Array{T,1}, ::Type) where T at array.jl:331
  similar(::Array, ::Type, !Matched::Tuple{Vararg{Int64,N}}) where N at array.jl:334
  similar(::AbstractArray, ::Type{T}) where T at abstractarray.jl:626
  ...
*(::JuMP.Containers.DenseAxisArray{VariableRef,2,Tuple{Array{Int64,1},Array{Int64,1}},Tuple{Dict{Int64,Int64},Dict{Int64,Int64}}}, ::Array{Float64,1}) at matmul.jl:51
top-level scope at rewrite.jl:227
top-level scope at macros.jl:762

Что происходит? Кажется, что умножение матриц не определено для матриц с переменными переходами?

Я знаю, что могу заменить это умножение матриц на вложенные sum(... for ...), но я хочу знать, возможно ли сделать это по-другому.

1 Ответ

3 голосов
/ 15 апреля 2020

Решение

@objective(model, Min, ones(10)'*(GiH*c1H))

у меня работает. Я использую Julia v1.4 и JuMP v0.21.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...