首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cvxpy不允许为MulExpression分配项目

cvxpy不允许为MulExpression分配项目
EN

Stack Overflow用户
提问于 2022-03-31 05:38:18
回答 1查看 123关注 0票数 0

作为优化约束的一部分,我有一个稀疏矩阵操作。我可以在Matlab中实现这个程序,现在我正在尝试实现一个cvxpy版本。问题是以下制约因素:

代码语言:javascript
复制
N - M << 0

M是一个稀疏矩阵,只有少数几个条目被声明为变量。我不知道有什么合适的方法来构造这个约束。

例如,

代码语言:javascript
复制
    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,但项目分配是不允许的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-31 17:02:13

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

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71687361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档