【问题标题】:how to express a trace-list as a expression in cvxpy如何将跟踪列表表示为 cvxpy 中的表达式
【发布时间】:2019-08-24 16:25:47
【问题描述】:

我有一系列常数矩阵和一个常数列表。我的目标是找到一个矩阵,它与给定系列中的矩阵相乘的痕迹是给定常数列表的最佳拟合。但我不知道如何将跟踪列表表示为cvxpy 中的表达式。请帮助我,我很感激任何帮助!

我试图将它表示为一个列表,但它不起作用,我不知道将这个列表转换为一个有效的表达式。这是我尝试过的代码和我得到的错误

p_esi = [cp.trace(it*self.dm) for it in M]
objective = cp.Minimize(cp.norm(p_esi))

ValueError                                Traceback (most recent call last)
<ipython-input-111-707f84b7ac4f> in <module>
      8 #res = fid.fidelity(p, p)
      9 
---> 10 fid.mlh(N, p)
     11 
     12 print(res)

<ipython-input-110-ddfa321a4b30> in mlh(self, N, p_exp)
    101 
    102         m = MLh(N)
--> 103         m.optimization(p_exp, self.out_M)
    104 
    105         return

<ipython-input-109-3e773ae1e745> in optimization(self, p, M)
     17 
     18         constraints = [self.dm >= 0, cp.trace(self.dm)==1]
---> 19         objective = cp.Minimize(cp.norm(p_esi))
     20         problem = cp.Problem(objective, constraints)
     21 

~/anaconda3/lib/python3.7/site-packages/cvxpy/atoms/norm.py in norm(x, p, axis)
     45         An Expression representing the norm.
     46     """
---> 47     x = Expression.cast_to_const(x)
     48     # matrix norms take precedence
     49     num_nontrivial_idxs = sum([d > 1 for d in x.shape])

~/anaconda3/lib/python3.7/site-packages/cvxpy/expressions/expression.py in cast_to_const(expr)
    444         """Converts a non-Expression to a Constant.
    445         """
--> 446         return expr if isinstance(expr, Expression) else cvxtypes.constant()(expr)
    447 
    448     @_cast_other

~/anaconda3/lib/python3.7/site-packages/cvxpy/expressions/constants/constant.py in __init__(self, value)
     42             self._sparse = True
     43         else:
---> 44             self._value = intf.DEFAULT_INTF.const_to_matrix(value)
     45             self._sparse = False
     46         self._imag = None

~/anaconda3/lib/python3.7/site-packages/cvxpy/interface/numpy_interface/ndarray_interface.py in const_to_matrix(self, value, convert_scalars)
     48             return result
     49         else:
---> 50             return result.astype(numpy.float64)
     51 
     52     # Return an identity matrix.

ValueError: setting an array element with a sequence.

【问题讨论】:

    标签: python cvxpy


    【解决方案1】:

    您有一个存储在p_esi 中的表达式列表,norm 期望将一个表达式传递给它。尝试使用hstack 将p_esi 连接成一个表达式。

    cp.norm(cp.hstack(p_esi))
    

    【讨论】:

    • 非常感谢,问题已解决。你的建议对我很有帮助。
    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 2022-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多