【问题标题】:Efficiently Setting up Sparse Matrices in MATLAB for Matrix Inversion在 MATLAB 中高效地设置稀疏矩阵以进行矩阵求逆
【发布时间】:2015-09-23 11:28:01
【问题描述】:

考虑最小二乘逆问题的正规方程的以下加权解:

m = inv(G'*W'*W*G)*G'*W'*W*d

我想设置权重矩阵W,这是一个对角线方阵,对角线上有权重。

由于我在 d (10⁷) 中有大量数据点,我的系统矩阵 G 也很大,但只有一维(因为我的数据点比模型参数多得多)。在 6 个模型参数的情况下,G 的大小为 (10⁷ × 6)。因此,W 的大小必须为 (10⁷ × 10⁷)。但是,它是稀疏的,只有 107 个非零条目(权重)。

为了减少内存,我在W 上使用稀疏。

要分配权重,我执行以下操作

d = [d1;d2];   
W = sparse(length(d),length(d)) 
w1 = length(d2)/length(d);
w2 = length(d1)/length(d);
W(1:length(d)+1:length(d)*length(d1)) = w1;
W(length(d)*length(d1)+1:length(d)+1:end) = w2;

d1d2 是带有观察值的列向量。

这将为对角线分配权重,但速度非常慢。

我的问题:

我也可以

  • 不知何故加快了对角线权重的分配,或者
  • 重写m = inv(G'*W'*W*G)*G'*W'*W*d,这样我就不用设置W了?

注意 1:图中的权重是两个不同的常数,但实际上它们会在允许对角线的情况下发生变化!

注意 2:代码的瓶颈确实是设置W,而不是反转本身,因为反转矩阵的大小仅为 (6 × 6)。

【问题讨论】:

  • d1d2 是什么?请发布可运行的代码。另外,d = [d1;d2] 意味着 w1w2 只是一个,Weye?为什么要两个对角线赋值(最后两行)?
  • d = [d1;d2] 是 nx 1 和 mx 1 向量的垂直串联,因此除了 length(d1)+length(d2) 之外不暗示 d1 和 d2 的长度= 长度(d)
  • 您是否尝试过使用W = sparse([1:numel(d1) 1:numel(d2)], 1:numel(d), [w1; w2], numel(d), numel(d));,其中w1w2 是列向量?这替换了初始化W = sparse(length(d),length(d)); 和两个赋值行
  • @LuisMendo:太好了,我没有意识到稀疏矩阵的这种初始化是可能的。它实际上甚至在纪录片中给出。它快了几个数量级。非常感谢!
  • 如果W 是真正的对角线,那么你最好用bsxfun(@times, G, [length(d2) length(d1)]/length(d)) 来计算G.' · W.'WGWd 是什么?

标签: performance matlab math matrix matrix-inverse


【解决方案1】:

根据W 的结构,我会说将G 分成两半并以W 作为标量产品来计算产品更有效:

G1 = G(1:length(d1),:);
G2 = G(length(d1)+1:end,:);

m = (w1^2*G1'*G1 + w2^2*G2'*G2) \ (w1^2*G1'*d1 + w2^2*G2'*d2);

另外,一般用A \ b代替inv(A)*b(即使A很小)。

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多