如何表示矩阵变量 X 的加权核范数并通过 CVX 函数将其最小化,或通过其他可能的包解决它

计算科学 简历
2021-12-25 00:42:30

我想最小化,其中是一个矩阵变量维数为是一个已知矩阵。我尝试了以下代码:f(x)=Tr(XTXA)Xd×dA

cvx_begin
    variable x(d,d)
    minimize(trace(sqrt(sum_square_abs(x))*A)) 
    subject to
        x(sp_index) == M(sp_index)
cvx_end

但是,仍然存在以下错误:

Error using cvx/sqrt (line 61)
Disciplined convex programming error:
Illegal operation: sqrt( {convex} ).

Error in Test_CVX_Iterative_Optimal (line 34)
    minimize(trace(sqrt(sum_square_abs(x))*A)) 

那么我应该如何通过CVX解决这个问题呢?期待你的答复!我还在 CVX 论坛 http://ask.cvxr.com/question/2894上问了同样的问题, 但还没有解决。希望这里的任何人都能够提供帮助!


更新:感谢@DavidKetcheson,我应该使用sqrtm()而不是sqrt. 为了表示我应该使用. 但是,我需要表示,我不知道如何用有效的 CVX 表达式来表示它.Tr(XTX)trace_sqrtm(sum_square_abs(x))Tr(XTXA)


我试过了

minimize(trace(sqrtm(sum_square_abs(x))*A))

替换sqrt原来的,但我收到以下错误

Undefined function 'schur' for input arguments of type 'cvx'.

Error in sqrtm (line 32)
[Q, T] = schur(A,'complex');  % T is complex Schur form.

Error in Test_WeightNucNorm (line 35)
        minimize(trace(sqrtm(sum_square_abs(x))*A))

我现在明白这个sqrtm()函数没有在 CVX 中实现,所以我有错误'未定义的函数'schur'对于'cvx'类型的输入参数。'。但是我的问题仍然没有解决。


我想我应该使用:

minimize(trace_sqrtm(sum_square_abs(x))*A)

但我仍然收到错误:

Error using cvx/trace_sqrtm (line 9)
Input must be affine.

Error in Test_WeightNucNorm (line 40)
        minimize(trace_sqrtm(sum_square_abs(x))*A)

---------- 重要更新感谢@k20,我犯了一个错误!!这不是矩阵的加权迹现在我的问题变成了:如何表示矩阵的加权核范数,其中是 CVX 变量,是对角权重矩阵。 我试图找到一个 CVX 函数,它给我变量的所有奇异值,但我还没有找到这样的函数。XXTXXXAX

2个回答

我要大胆地说你做错了,因为你的目标是最小化加权核范数,但你的方程不同意。核范数是奇异值的总和。加权核范数是奇异值的加权和。如果您的矩阵 A 旨在成为奇异值权重的对角矩阵,那么我认为您的方程不代表正确的加权和。

对问题http://ask.cvxr.com/question/1708/maximize-the-minimum-singular-value/的回答表明,最小奇异值不是凸函数或凹函数,因此 cvx 无法处理它. 因此,cvx 似乎不太可能像加权核范数所要求的那样处理奇异值的任意加权和。

最小化f(x)相当于最小化f(x)只要f(x)0因为取平方根是单调变换。只需从目标函数中删除平方根即可。