【问题标题】:Matlab: create this particular SPARSE matrix to solve a quadratic programMatlab:创建这个特殊的 SPARSE 矩阵来求解二次程序
【发布时间】:2014-08-16 14:36:13
【问题描述】:

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

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

向量x 的维度为(n*d^2),其中n 很大,d 很小(在我的问题中:n = 220512d = 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

现在我想将Q创建为一个稀疏矩阵(否则在求解原始二次程序时会出现MEMORY问题,例如使用quadprog)。

提前感谢您的任何建议。

【问题讨论】:

  • 请仅使用相关标签并在使用前阅读其说明。
  • @Ali:打扰了。

标签: matlab sparse-matrix


【解决方案1】:

要在稀疏的“域”中构建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

【讨论】:

  • 感谢您的回答。小尺寸没问题,但对于我的问题,它已经运行了几分钟并且仍然继续运行...... :(
  • 现在已经 25 分钟了,没有消息 :( 我的电脑规格还不错:16GB RAM,Intel Core i7-4770 3.4 GHz(四核)。
【解决方案2】:

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

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(给了一个例子here)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多