Matlab:创建这个特殊的SPARSE矩阵来解决二次规划

时间:2014-06-25 21:14:57

标签: matlab sparse-matrix

我正在尝试解决以下大规模二次规划:

  

min(1/2 * x' * Q * x + c' * x)受x> = 0

其中,向量x的维度为(n*d^2),其中n非常大且d很小(在我的问题中:n = 220512和{{1} }})。

矩阵d = 16是稀疏的,并且构造如下。

Q

one = ones(d,1); A = kron(eye(d),one'); B = repmat(diag(one),1,d); M = A'*A + B'*B; 是一个块对角线矩阵,其中有Q个相同的块(在对角线上),每个块都是矩阵n

现在我想创建M作为稀疏矩阵(否则在解决原始二次规划时会出现MEMORY问题,例如使用Q。)

提前感谢您提出任何建议。

2 个答案:

答案 0 :(得分:0)

要在稀疏“域”中构建Q,最简单的方法是循环遍历块:

one = ones(d,1);
A = kron(eye(d),one');
B = repmat(diag(one),1,d);
M = A'*A + B'*B;

S = d^2*n;
Q = sparse(S, S); %'// preallocates with zeros
for b = 0:d^2:S-1
    Q(b+(1:d^2),b+(1:d^2)) = M;
end

d=2n=3的示例结果:

>> full(Q)
ans =
     2     1     1     0     0     0     0     0     0     0     0     0
     1     2     0     1     0     0     0     0     0     0     0     0
     1     0     2     1     0     0     0     0     0     0     0     0
     0     1     1     2     0     0     0     0     0     0     0     0
     0     0     0     0     2     1     1     0     0     0     0     0
     0     0     0     0     1     2     0     1     0     0     0     0
     0     0     0     0     1     0     2     1     0     0     0     0
     0     0     0     0     0     1     1     2     0     0     0     0
     0     0     0     0     0     0     0     0     2     1     1     0
     0     0     0     0     0     0     0     0     1     2     0     1
     0     0     0     0     0     0     0     0     1     0     2     1
     0     0     0     0     0     0     0     0     0     1     1     2

答案 1 :(得分:0)

我从某人那里得到了这个答案:

MSparse = sparse(M);
% replicate: please don't test with n=220512 directly
Mblk = repmat({MSparse}, 1, n);
% convert do block diagonal
Q = blkdiag(Mblk{:});

大约15分钟后创建并存储矩阵。

然而,矩阵需要大约9GB的内存,因此减慢了所有内容(虽然保存到文件时只需要1.1Gb),所以我想用 quadprog <解决原始二次问题没有太大的希望/ em>(示例为here)。