如何在 MOSEK 中重塑变量

How do I reshape variables in MOSEK

我正在尝试将用 MATLAB CVX 编写的优化代码转换为 Python 直接调用求解器 MOSEK 的代码。 我的优化包括以下类型的方程式:

||Ax-b|| +正则化器。

x是一个三维变量,需要评估其最优值。我在 MATLAB 中将 A 定义为一个函数,如下所示:

function D = A(X)   

n = size(X,1);
m = size(X,2);
nim = size(X,3);
for t = 1:nim
    temp = X(:,:,t);
    D(:,:,t) = squeeze(sum(sum(reshape(temp,7,19,7,19),1),3));
end
end

所以,||Ax-b||在 MATLAB CVX 中变为

norm((vec(A(x)-b)))

现在,当我转换为 python 直接调用 MOSEK 时,我写:

def lseReg(b,I,n,m,d,n1,m1,alpha,beta):
    M = Model("LSE-REG")
    x = M.variable("x", [n,m,d] )
    t = M.variable("t")
    
    y = M.variable("y",[n1,m1,d])
    for i in range(0,d):
        temp = x.slice([0,0,i],[n,m,i])
        temp2 = Var.reshape(temp,[19,7,19,7])
        y.slice[[0,0,i],[n1,m1,i]] =  Expr.sum(Expr.sum(temp2,3),1)
        
    r = Expr.sub(b,y)
    M.constraint(Expr.vstack(0.5,t,r),Domain.inRotatedQCone())
    t2 = M.variable("t2")
    r2 = Expr.sub(I,Expr.sum(x,2))
    M.constraint(Expr.vstack(0.5,t2,r2),Domain.inRotatedQCone())
    #the Objective
    ObjExpr1 = t.asExpr()
    ObjExpr2 = t2.asExpr()
    ObjExpr3 = Expr.mul(alpha,lassoVar(M,x,n,m,d))
    ObjExpr4 = Expr.mul(beta,lassoTV(M,x,n,m,d))
    objExpr = Expr.add(ObjExpr1,ObjExpr2,ObjExpr3,ObjExpr4)
    M.objective(ObjectiveSense.Minimize,objExpr)
    return M

但是,我收到错误消息:

  File "C:\Users\Anaconda\lib\site-packages\mosek\fusion\impl\_implementation.py", line 13779, in reshape
    return mosek_fusion_Var._reshape_alt_Lmosek_4fusion_4Variable_2_3I(*args)

  File "C:\Users\Anaconda\lib\site-packages\mosek\fusion\impl\_implementation.py", line 13967, in _reshape_alt_Lmosek_4fusion_4Variable_2_3I
    _1 = mosek_fusion_Var._reshape_Lmosek_4fusion_4Variable_2_3I(_0,_1)

  File "C:\Users\Anaconda\lib\site-packages\mosek\fusion\impl\_implementation.py", line 13976, in _reshape_Lmosek_4fusion_4Variable_2_3I
    return (_0._reshape__3I(_1))

  File "C:\Users\Anaconda\lib\site-packages\mosek\fusion\impl\_implementation.py", line 10897, in _reshape__3I
    raise mosek_fusion_LengthError._ctor_S("Shape size does not match variable size")

LengthError: Shape size does not match variable size

我在这个重塑中做错了什么?

这个:

x.slice([0,0,i],[n,m,i])

会给你一个大小为0的对象,你的意思可能是

x.slice([0,0,i],[n,m,i+1])

请记住,“最后”索引是您想要的切片的最后一个元素后面的那个 1。

您不能将事物分配给切片,这是非法的:

y.slice[[0,0,i],[n1,m1,i]] =

相反,您可能想要进行约束。

这些是可能对其他人有用的一般性评论。我们知道您已将问题发送给 MOSEK 支持,我们将在那里回答您其他问题的更多详细信息。