使用反斜杠求解稀疏矩阵的高计算时间

计算科学 matlab 稀疏矩阵
2021-12-03 08:12:01

我在每一步都建立了一个稀疏矩阵A,如下所示:

% 1 < DX < 120000 

A = sparse(i,j,s,DX,DX,6*DX)

b = (1, DX)

我正在处理的问题是离散化问题。我最多有 120000 个节点。这些节点中的每一个都有特殊字符,我只选择满足(以前)定义的标准的那些。这些选择的数量DX完全取决于物理过程。

我在x = A\b. 但是随着 A 的大小可能变得非常大,计算时间急剧增加(超过10e5时间步长DX > 6e4)。据我所知,反斜杠操作已经在 MATLAB 中得到了很好的优化,但我想知道:

  1. codegen使用代码并将其转换为 C 是否有意义?

  2. 有没有人知道一种替代方法而不是反斜杠,从而减少计算时间(也许是一种迭代方法?)?

2个回答

您可以尝试使用 MATLAB 提供的迭代求解器之一,因为 x = A\b 适用于许多系统,您可能会遇到内存问题导致速度减慢。

或者,MATLAB 有许多内置函数,用于迭代求解稀疏矩阵的 Ax=b,例如pcq(), bigcg(), cgs()等。

请参阅有关求解线性方程组的交互方法的 MATLAB 文档

由于(我假设)您的矩阵大小及其结构可能会随着时间步长而变化,例如,您不能计算一次有效的排序,然后使用 chol() 函数重新使用它来计算解决方案。

反斜杠运算符确实会产生一些轻微的开销,以确定您的矩阵是否密集/稀疏、对称等。例如,如果您的矩阵是对称的,您可以通过计算排序(例如 symamd())然后使用它来稍微提高性能与 chol()。

如果我理解正确,您正在计算 1e6 个时间步长?我不认为您可以使用需要更少时间步长的替代时间积分算法?