具有稀疏 b 的 MATLAB 线性最小二乘法

MATLAB linear least squares with sparse b

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

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

b 稀疏度约为 26%,A 接近稠密。从 mldivide 文档来看,如果 b 稀疏,A\b 似乎运行了一种特殊算法。

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

正在寻找有关如何加速此计算的建议。

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

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

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

  3. 的 Matlab 文档中提供的方案

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

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