作为优化约束的一部分,我有一个稀疏矩阵操作。我可以在Matlab中实现这个程序,现在我正在尝试实现一个cvxpy版本。问题是以下制约因素:
N - M << 0M是一个稀疏矩阵,只有少数几个条目被声明为变量。我不知道有什么合适的方法来构造这个约束。
例如,
N = cp.Variable((800, 800), PSD=True)
a = cp.Variable((10, 1), nonneg=True)M是一个800* 800矩阵,其中Mi,i= ai表示0<=i<10,其余的M都是0。
我现在所做的是声明M为M= cp.Variable((800,800),symmetric=True),然后添加类似的约束
constraints.append(Mi,i==ai)用于0<=i<10,constraints.append(Mi,j==0)用于M的其余部分,但这样做需要花费大量时间,而且约束列表也很大。我想知道这样做的最佳方式是什么。
我也尝试做一些像Ni,我-= ai为0<=i<10,但项目分配是不允许的。
发布于 2022-03-31 17:02:13
您可以使用这个函数创建一个具有给定稀疏模式的变量:
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)https://stackoverflow.com/questions/71687361
复制相似问题