如何在 la numpy 中对 cvxopt 矩阵执行操作?

How to perform operations on cvxopt-matrices a la numpy?

我正在使用 cvxopt 矩阵,以便在 picos 库中使用它们。一般来说,我想取一个矩阵,在某个向量上对其进行评估,减去一些东西,然后取其条目的最大绝对值

import picos as pic
import cvxopt as cvx
import numpy as np

(...)

P = pic.Problem()
theta = P.add_variable('theta', size=k, vtype='continuous', lower=-10, upper=10)
theta

P.add_constraint(max(abs(M*theta - b)) <= 5)
P.minimize(theta)

(这里 b 是一些被视为 cvxopt 矩阵的向量。)但是,我得到的错误如下:

TypeError                                 Traceback (most recent call last)
<ipython-input-11-8884e5cb14dc> in <module>
      3 theta
      4 
----> 5 P.add_constraint(max(abs(M*theta - b.T)) < 45)
      6 P.minimize(theta)
      7 

TypeError: 'Norm' object is not iterable

我想知道是否有一种 cvxopt 可以接受的替代方法来进行这些计算?

(除了多年前的小实验外,从未真正使用过这个库)

看起来罪魁祸首是那些高度复杂的自动转换建模系统工具中隐藏魔法的经典案例。

  • pics overloads abs in abs(M*theta - b)
    • 参见:doc
    • 这导致类型 Norm(基于 picos 的类型)
  • picos 可能 不会在 max(abs(M*theta - b.T)) 中超载 max
    • python 的 max-operator(不是从 picos 定制的东西!)将被使用,它基于对某些 iterable
    • 的线性搜索
    • 这里的可迭代对象是 Norm 对象;但它不可迭代,因为错误显示

另请参阅:list of overloaded operators

在我看来,这个功能 max 是缺失的。您可以手动将其线性化,但是...这很烦人。

如果你不需要 picos 的特殊功能,cvxpy 非常相似,也支持 absmax(并且基于 scipy 的稀疏矩阵 + numpy 数组;感谢上帝!)。