稀疏LU与部分透视

时间:2013-06-30 11:13:06

标签: matlab matrix linear-algebra sparse-matrix

我想在稀疏矩阵上使用部分旋转执行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?

谢谢, 吉尔

1 个答案:

答案 0 :(得分:2)

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

  1. 您是否知道您正在处理[l u p]版本中的完整矩阵,而不是稀疏矩阵?

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

  3. 完全旋转用于减少分解稀疏矩阵时发生的 fill 的数量(不适用于完整矩阵)。通过以最佳方式对两者行和列进行排序,性能显着提高。
  4. 速度增加的原因是因为非零沿对角线排列。但是:

    “稀疏与条目的结构有关:对角线周围的零带,在它外面为零。”不正确。

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

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

    查看lu的结构。你可能会得到一个线索,为什么在完全旋转时事情会更快。

    此外,当你尝试解决这个问题时,它并不是更快的因子化部分,它是后来的替代部分。