我想在稀疏矩阵上使用部分旋转执行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?
谢谢, 吉尔
答案 0 :(得分:2)
我觉得我必须澄清一些事情:
您是否知道您正在处理[l u p]
版本中的完整矩阵,而不是稀疏矩阵?
部分旋转用于获得数值稳定性,而不是提高性能。
速度增加的原因是因为非零沿对角线排列。但是:
“稀疏与条目的结构有关:对角线周围的零带,在它外面为零。”不正确。
稀疏矩阵是一个主要包含零的矩阵,表示三个向量(行,列和值)。
sparse()
是将完整矩阵转换为稀疏矩阵的完美有效方法。 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
的结构。你可能会得到一个线索,为什么在完全旋转时事情会更快。
此外,当你尝试解决这个问题时,它并不是更快的因子化部分,它是后来的替代部分。