我认为你可以通过显式进行
LU分解来节省大量计算时间,
[l, u, p, q] = lu(X'*X);
并在进行计算时使用这些因子。此外,由于
X
在约100个模型中都是常量,预先计算
X'*X
很可能会节省你一些时间。
请注意,在你的情况下,最耗时的操作很可能是
sqrt
函数。
M = X'*X;
[l, u, p, q] = lu(M);
% Now, I guess this should be quite a bit faster (I might have messed up the order):
nwse = sqrt(diag(N.*(q * ( u \ (l \ (p * Q))) * q * (u \ (l \ p)))));
前两个术语是常用的:
l:下三角矩阵
u:上三角矩阵
现在,p和q则不太常见。
p是行置换矩阵,用于获得数字稳定性。对于稀疏矩阵,使用[l、u、p] = lu(M)与使用[l、u] = lu(M)相比,性能提升不大。
然而,q可以显著提高性能。q是列置换矩阵,用于在进行因式分解时减少填充量。
请注意,[l、u、p、q] = lu(M)仅适用于稀疏矩阵的有效语法。
关于为什么如上所述使用完全主元消元法应该更快:尝试以下操作以查看列置换矩阵 q 的目的。围绕对角线对齐的元素更易处理。
S = sprand(100,100,0.01);
[l, u, p] = lu(S);
spy(l)
figure
spy(u)
现在,将其与此进行比较:
[ll, uu, pp, qq] = lu(S);
spy(ll);
figure
spy(uu);
很不幸,我现在没有MATLAB,所以无法保证我将所有参数放置在正确的顺序中,但我认为是正确的。
((X'X)*((sparseinv(Q)*X')*X)*X
。从这里获取sparseinv
。 此外,您可以尝试在math.stackexchange.com上发布此问题。确保您以数学方式表述。可能有一些技术可以利用稀疏性和正定属性。 - Autonomousinv
从来不是正确的方法... 我稍后会回复你 =)X
是一个向量,对吗? - Stewie Griffin