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

Julia error using convex package with diagind function

我正在尝试解决问题

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: no method matching diagind(::Convex.Variable)

我只是通过约束矩阵中的对角线元素来解决最优问题,但是这里的 diagind 函数似乎不起作用,我该如何解决这个问题。

我认为以下内容符合您的要求:

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 是否支持。