在MATLAB中有效地设置稀疏矩阵用于矩阵求逆

时间:2015-07-06 10:42:11

标签: performance matlab math matrix matrix-inverse

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

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

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

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

为减少记忆,我在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)。

1 个答案:

答案 0 :(得分:0)

根据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很小)。