问题描述
我想构建一个具有以下形式的块矩阵
Q = [[A,B],[C,D]]
其中每个块 A,B,C,D
是以下矩阵:
-
A
只是 2x2 单位矩阵 -
B
是一个 2x1 向量b=(b_1,b_2)
嵌入到身份B = diag(b_1,b_2)
的对角线上
-
C
是B
的转置
-
D
是由某个常数d
、D = d*A
乘以的 2x2 身份
我的优化问题是 min d
使得 Q >> 0
,即 PSD 条件。 我需要帮助解决这个问题。
困惑:
- 我知道如何使用 Numpy
np.eye(2)
制作 2x2 单位矩阵。我不确定在我的矩阵Q
中使用它是否有意义。 - 此外,对于
b
我定义b = cvxpy.Variable((2,1))
。然后,我也可以将它的转置定义为b_t = b.T
但如果没有外积,我如何将其设为矩阵B
和C
?也就是说,我需要将向量的元素嵌入到矩阵的对角线中。 - 由于
d
是我最小化的变量,因此我需要将其定义为d = cvxpy.Variable(1)
。但是我不能简单地将它与单位矩阵相乘以获得diag(t,t)
,我称之为T = t*np.eye(2)
。
一般来说,我不知道是否需要先将块矩阵 Q
定义为
Q = cvxpy.Variable((4,4))
或 Q = cvxpy.Parameter((4,4))
,然后上面的所有术语都使用 cvxpy.bmat
为其提供精确的形式。
感谢任何帮助。
解决方法
您可能会在编程站点以外的地方得到更好的答案。然而,在这种情况下,它是直截了当的。
因为交换两行和(相同的)两列可以通过
M -> Q'*M*Q
其中 Q 是置换矩阵(因此是正交的),如果原始矩阵是 PSD,则这样的变换矩阵将是 PSD。
如果我们写
M = ( 1 0 b1 0 )
( 0 1 0 b2)
( b1 0 d 0 )
( 0 b2 0 d )
并交换我们得到的中间两行和列
M = ( 1 b1 0 0 )
( b1 d 0 0 )
( 0 0 1 b2 )
( 0 0 b2 d )
如果对角线上的两个块是 PSD,则该矩阵将是 PSD,当 iff
d > max( b1*b1,b2*b2)