代码之家  ›  专栏  ›  技术社区  ›  Carpetfizz

MATLAB线性最小二乘稀疏b

  •  1
  • Carpetfizz  · 技术社区  · 6 年前

    Ax = b . 我有一些巨大的矩阵

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

    b 稀疏度为26%和 A mldivide 医生,好像 A\b 运行特殊算法,如果 是稀疏的。

    然而,目前,解决是需要30分钟以上(我已经手动终止后,这段时间,所以我不知道它实际上需要多长时间)。

    寻找如何加速计算的建议。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Pablo Jeken Rico    6 年前

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

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

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

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