我想在稀疏矩阵上执行带有部分枢轴的LU分解。对于稀疏矩阵来说,完全旋转似乎是非常快速和有效的,而对于稀疏矩阵,部分旋转则不是有效的。我的猜测是,它不支持或优化稀疏。
A=randn(1e4).*(rand(1e4)<0.0001);
S=sparse(A);
tic; [l,u,p]=lu(A); toc
Elapsed time is 8.699264 seconds.
tic; [l,u,p,q]=lu(S); toc
Elapsed time is 0.006430 seconds.
第二个,完全枢转的速度极快(提高了1400倍)
我的问题是,怎么可能呢?当矩阵是稀疏的,并且总是(或几乎总是)比完全枢转更快时,部分枢转LU不应该更有效吗?
有人知道我如何在稀疏矩阵上执行部分旋转的快速LU吗?
谢谢,Gil
我觉得我必须澄清一些事情:
-
你知道你在
[l u p]
版本中使用的是全矩阵,而不是稀疏矩阵吗? -
部分枢转用于获得数值稳定性,而不是提高性能。
- 完全旋转用于减少因子分解稀疏矩阵时发生的填充的量(对于全矩阵不可能)。通过以最佳方式对行和列进行排序,性能显著提高
速度增加的原因是非零沿对角线排列。但是:
"稀疏与条目的结构有关:对角线周围有一个零带,对角线外有零。"不正确。
稀疏矩阵是一个主要包含零的矩阵,由三个向量(行、列和值)表示。
CCD_ 2是将全矩阵转换为稀疏矩阵的一种非常有效的方法。Duffymo的声明:"如果它取一个全矩阵并将其映射到稀疏矩阵数据结构中,那么它当然会更慢。"是不正确的,只要全矩阵大多包含零。
尝试以下操作:
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);
看看l
和u
的结构。你可能会知道为什么在完全旋转的情况下事情会更快。
此外,当你试图解决这个问题时,实际上不是分解部分更快,而是前向替换部分。