Пишу программу оптимизации на Джулии с помощью 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 ответ
Решение
@objective(model, Min, ones(10)'*(GiH*c1H))
Работает на меня. Я использую Julia v1.4 и JuMP v0.21.2.
Похожие вопросы
Новые вопросы
matrix
В математике матрица (множественные матрицы) - это прямоугольный массив чисел, символов или выражений, расположенных в строках и столбцах. Отдельные элементы в матрице называются ее элементами или записями.