【问题标题】:MATLAB linear least squares with sparse b具有稀疏 b 的 MATLAB 线性最小二乘
【发布时间】:2019-03-02 20:18:06
【问题描述】:

我正在尝试解决 Ax = b 形式的 llsq 问题。我有一些巨大的矩阵,其中

size(A) = 26181 13090
size(b) = 26181 1

b 的稀疏度约为 26%,A 几乎是密集的。从mldivide 文档来看,如果b 是稀疏的,似乎A\b 运行一个特殊算法。

但是,目前,解决需要 30 分钟以上(我在此时间后手动终止,所以我不知道实际需要多长时间)。

寻找有关如何加快计算速度的建议。

【问题讨论】:

  • b实际上是稀疏类型还是只是一个有很多零的法线向量?
  • 我相信 ~8GB 应该足以解决这些矩阵,就好像它们是密集的一样。对于几乎密集的 A,无论如何您都不会节省大量内存。

标签: matlab linear-regression linear-algebra numerical-methods


【解决方案1】:

由于我还不能评论,所以我会在这里写一些建议。

  1. 稀疏性: 如果您将矩阵 A 或向量 b 声明为稀疏,请撤消它。稀疏系统上的微积分比非 0 条目百分比高于 ~20% 的矩阵的密集微积分慢(这里不要引用我,只是大约)。这不仅适用于求解,也适用于乘法和所有其他事情。 Link to sparse questions, SO

  2. 反斜杠运算符 反斜杠运算符在求解矩阵之前对其进行分析。根据属性,它使用不同的求解器(LU、Cholesky、...)。这样,它几乎总是最快、最舒适的解决方案。当矩阵稀疏时,反斜杠运算符启动不同的例程,首先检查不同的属性。检查 backslash operator (bottom) 的 Matlab 文档中提供的方案。

比反斜杠运算符更快地解决大问题的唯一方法是使用迭代求解器。这些求解器(例如 CG - 共轭梯度法)具有线性依赖于矩阵大小的平方根的计算量。它们在大型矩阵系统上非常有效,但在小型矩阵系统上速度较慢。它们也没有提供精确的解决方案,但是可以将残差设置得非常低,从而提供几乎正确的解决方案。大多数迭代求解器的缺点是它们需要您的矩阵满足某些标准。在 CG 的情况下,您的矩阵必须是正定且对称的(例如)。恐怕,在您的情况下,这些迭代求解器可能没有任何帮助:/

希望我能澄清一下,祝你好运!

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2015-10-31
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 2022-11-13
    • 2014-10-09
    相关资源
    最近更新 更多