我试图在Mosek中求解一个带有形式约束的C++融合的半正定程序。
其中每个M_j是一个半正定矩阵。目前,我正在创建约束,使用for循环在A_{i,j} M_j上求和,使用另一个for循环来添加所有约束。然而,约束的数量相当大,并且使用M->约束(.)到目前为止,这是我节目中最慢的部分。我正在查看Mosek文档,似乎矢量化可以加快程序的速度。但是,我正在为求和A_{i,j} M_j而进行矢量化。每个变量的数据类型如下:
A: vector < vector < Matrix::t > >
M: vector < Variable::t >
c: vector < shared_ptr < ndarray < int,1 > > >
y: Variable::t
x: Variable::t
b: vector < int > 我试过在A和M上使用new_array_ptr,然后使用Expr::add和Expr::dot,但这两种方法都不起作用。对矢量化或加速M->约束的任何帮助(.)我会非常感激的!
发布于 2022-01-28 07:57:08
这有点棘手。由于您的每个约束都涉及到矩阵的乘积,进一步将其矢量化将需要增加高维对象(张量?)的能力。而且融合没有一个接口。
您可以做的一件事是确保您的A表示为稀疏矩阵,如果它们确实是稀疏的。
另一种解决方案是使用C重写所有内容。您的数据似乎已经采用了一种允许相对轻松地进行翻译的格式。
最后但同样重要的是,如果您可以将您的代码打包到一个可复制的示例中,并发送到MOSEK支持(电子邮件这里是https://www.mosek.com/support/),那么我可以在那里更具体地检查在Mosek中是否存在一些效率低下的问题,或者您的代码中是否有任何改进之处。
https://stackoverflow.com/questions/70881947
复制相似问题