cvxpy不允许为MulExpression分配项



我有一个稀疏矩阵运算作为优化约束的一部分。我可以在Matlab cvx中实现该程序,现在我正在尝试实现一个cvxpy版本。问题在于以下约束:

N - M << 0

M是一个稀疏矩阵,只有几个条目是声明变量。我不知道如何构造这种约束。

例如,

N = cp.Variable((800, 800), PSD=True)
a = cp.Variable((10, 1), nonneg=True)

M是800*800矩阵,对于0<i<M的其余部分都是0。

我现在所做的是将M声明为M=cp.Variable((800800(,symmetric=True(,然后添加像这样的约束

constraints.append(M[i,i]==a[i](用于0<i<10;和constraints.append(M[i,j]==0(用于M的其余部分。但是这种方式需要大量时间,并且约束列表也很大。我想知道最好的方法是什么。

我也试着做一些事情,比如N[I,I]-=a[I]对于0<i<10,但不允许项目分配。

您可以使用此函数创建具有给定稀疏性模式的变量:

from typing import List, Tuple
import cvxpy as cp
import scipy.sparse as sp
import numpy as np
def sparse_variable(shape: Tuple[int, int], sparsity: List[Tuple[int, int]]):
"""Create a variable with given sparsity pattern."""
nnz = len(sparsity)
flat_var = cp.Variable(nnz)
# Column major order.
V = np.ones(nnz)
I = []
J = []
# Column-major order.
for idx, (row, col) in enumerate(sparsity):
I.append(row + col * shape[0])
J.append(idx)
reshape_mat = sp.coo_matrix((V, (I, J)), shape=(np.prod(shape), nnz))
return cp.reshape(reshape_mat @ flat_var, shape)

最新更新