使用具有diagind函数的凸包的Julia错误

时间:2018-04-22 12:47:25

标签: julia linear-algebra convex-optimization convex

我试图解决问题

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函数在这里不起作用,我该如何解决问题。

1 个答案:

答案 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 构建矢量
  • 中的对角矩阵

因此,要让XXX且对角线为零,我们会从中减去X的对角线。要约束X对角线1,我们使用1 将其对角线与==进行比较。

最好尽可能保留不可变值,而不是尝试修改内容。我不知道Convex是否支持这一点。