我试图解决问题
d = 0.5 * ||X - \Sigma||_{Frobenius Norm} + 0.01 * ||XX||_{1},
其中X是对称正定矩阵,并且所有诊断元素应该是1.XX与X相同,除了对角矩阵为0. \ Sigma已知,我希望最小d与X.
我的代码如下:
using Convex
m = 5;
A = randn(m, m);
x = Semidefinite(5);
xx=x;
xx[diagind(xx)].=0;
obj=vecnorm(A-x,2)+sumabs(xx)*0.01;
pro= minimize(obj, [x >= 0]);
pro.constraints+=[x[diagind(x)].=1];
solve!(pro)
MethodError:没有匹配diagind(:: Convex.Variable)的方法
我只是通过约束矩阵中的对角线元素来解决最优问题,但似乎diagind函数在这里不起作用,我该如何解决问题。
答案 0 :(得分:1)
我认为以下是您想要的:
m = 5
Σ = randn(m, m)
X = Semidefinite(m)
XX = X - diagm(diag(X))
obj = 0.5 * vecnorm(X - Σ, 2) + 0.01 * sum(abs(XX))
constraints = [X >= 0, diag(X) == 1]
pro = minimize(obj, constraints)
solve!(pro)
对于操作类型:
diag
提取矩阵的对角线,作为向量diagm
构建矢量因此,要让XX
为X
且对角线为零,我们会从中减去X
的对角线。要约束X
对角线1
,我们使用1
将其对角线与==
进行比较。
最好尽可能保留不可变值,而不是尝试修改内容。我不知道Convex
是否支持这一点。