【问题标题】:Sparse LU with Partial Pivoting [closed]具有部分旋转的稀疏 LU [关闭]
【发布时间】:2013-06-30 11:13:06
【问题描述】:

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

谢谢, 吉尔

【问题讨论】:

  • 在第一行尝试 lu 分解 S,而不是 A。您正在比较两个没有真正可比性的操作。
  • 是的,但是如果我将它应用到 S 上,它甚至比在 A 上还要慢。
  • 不,不是。在这种情况下,你做错了什么。你能展示你对那个案例的结果吗?
  • 你是对的。很抱歉给您带来麻烦,谢谢!

标签: matlab matrix linear-algebra sparse-matrix


【解决方案1】:

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

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

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

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

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

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

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

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 的结构。您可能会明白为什么完全旋转会更快。

另外,真正更快的并不是因式分解部分,而是稍后当您尝试解决这个问题时的前向替换部分。

【讨论】:

  • 您关于包含大部分零的稀疏矩阵的陈述是绝对正确的。根据我使用有限元方法的经验,这通常意味着带状矩阵。我无法判断整个矩阵是否包含大部分零;你看到了吗?
  • 是的,试试他的代码,它的大小更易于管理:A=randn(10).*(rand(10)&lt;0.1)。他的代码相当于S = sprand(1e4,1e4,0.0001);。
  • 感谢罗伯特 P. 的指导。
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 2019-12-30
  • 2020-08-20
  • 2015-05-08
  • 2023-03-28
  • 1970-01-01
  • 2021-11-30
  • 2021-06-23
相关资源
最近更新 更多