具有部分数据透视的稀疏LU



我想在稀疏矩阵上执行带有部分枢轴的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

我觉得我必须澄清一些事情:

  1. 你知道你在[l u p]版本中使用的是全矩阵,而不是稀疏矩阵吗?

  2. 部分枢转用于获得数值稳定性,而不是提高性能。

  3. 完全旋转用于减少因子分解稀疏矩阵时发生的填充的量(对于全矩阵不可能)。通过以最佳方式对行和列进行排序,性能显著提高

速度增加的原因是非零沿对角线排列。但是:

"稀疏与条目的结构有关:对角线周围有一个零带,对角线外有零。"不正确。

稀疏矩阵是一个主要包含零的矩阵,由三个向量(行、列和值)表示。

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);

看看lu的结构。你可能会知道为什么在完全旋转的情况下事情会更快。

此外,当你试图解决这个问题时,实际上不是分解部分更快,而是前向替换部分。

相关内容

  • 没有找到相关文章

最新更新