cvxpy 不允许为 MulExpression 分配项目
cvxpy not allowing item assignment for 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的矩阵,其中M[i,i]=a[i]为0<=i<10,其余M全为0。
我现在所做的是将 M 声明为 M = cp.Variable((800,800), symmetric=True), 然后添加约束 like
constraints.append(M[i,i]==a[i]) 对于 0<=i<10;和 constraints.append(M[i,j]==0) 对于 M 的其余部分。但是这样,它需要很多时间,而且约束列表也很大。我想知道最好的方法是什么。
我也试过做N[i,i] -= a[i] for 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)
我有一个稀疏矩阵运算作为优化约束的一部分。我可以在 Matlab cvx 中实现该程序,现在我正在尝试实现一个 cvxpy 版本。问题是以下约束:
N - M << 0
M是一个稀疏矩阵,只有少数条目是声明变量。我不知道构造此约束的合适方法。
例如,
N = cp.Variable((800, 800), PSD=True)
a = cp.Variable((10, 1), nonneg=True)
M是一个800*800的矩阵,其中M[i,i]=a[i]为0<=i<10,其余M全为0。
我现在所做的是将 M 声明为 M = cp.Variable((800,800), symmetric=True), 然后添加约束 like
constraints.append(M[i,i]==a[i]) 对于 0<=i<10;和 constraints.append(M[i,j]==0) 对于 M 的其余部分。但是这样,它需要很多时间,而且约束列表也很大。我想知道最好的方法是什么。
我也试过做N[i,i] -= a[i] for 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)