我正在尝试解决以下大规模二次规划:
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
。)
提前感谢您提出任何建议。
答案 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=2
和n=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)。