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

时间:2018-09-27 01:26:58

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

我正在尝试解决Dim filep = "" Dim saveDialog As New SaveFileDialog saveDialog.DefaultExt = "xls" saveDialog.Filter = "Excel File (*.xlsx)|*.*" If saveDialog.ShowDialog() = DialogResult.OK Then Using st As New IO.FileStream(saveDialog.FileName, FileMode.Create, FileAccess.Write, FileShare.None) GridEXExporter1.Export(st) filep = saveDialog.FileName End Using End If 形式的llsq问题。我有一些巨大的矩阵,其中

Ax = b

size(A) = 26181 13090 size(b) = 26181 1 的稀疏度约为26%,而b则稀疏。从A文档来看,如果mldivide稀疏,似乎A\b运行一种特殊的算法。

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

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

1 个答案:

答案 0 :(得分:1)

由于我目前无法发表评论,因此我将在此处写一些建议。

  1. 稀疏性: 如果您将矩阵A或向量b声明为稀疏,则将其撤消。稀疏系统上的演算比矩阵的密集演算要慢,非零项的百分比高于〜20%(此处不引用我,只是大约)。这不仅适用于求解,还适用于乘法和所有其他事情。 Link to sparse questions, SO

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

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

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