Which solver should I use to solve a square and symmetric, linear system of equations?

38 ビュー (過去 30 日間)
I want to solve a linear system of equations which is always square and symmetric. So far I always use mldivide ("backslash"). However, I was wondering if there is an even more efficient solver when I can assure that the matrix is always symmetric? I saw for example that there is a solver called SYMMLQ which seems to be especially designed for symmetric matrices (I actually have not that many mathematical knowledge about solvers). Is this one maybe interesting for my case?

採用された回答

Christine Tobler
Christine Tobler 2022 年 3 月 16 日
The first thing to check is the size and density of your matrix. The SYMMLQ function you mentioned is one of a group of methods for iteratively solving sparse linear systems (see doc), which should be used if your linear system is large and sparse (that is, around 1e4-by-1e4 at least to have a good likelyhood to be faster.
For a dense matrix, or for many sparse matrices, it's simpler and faster to use backslash. If A is real and exactly symmetric (issymmetric returns true), mldivide will use a symmetric algorithm if appropriate. You can symmetrize A in advance like Bruno suggests, which will backslash to always use a symmetric algorithm - in particular if your matrix is symmetric positive or negative definite, this is likely to help with performance since Cholesky is used in mldivide just as Torsten demonstrated.

その他の回答 (3 件)

Bruno Luong
Bruno Luong 2022 年 3 月 16 日
編集済み: Bruno Luong 2022 年 3 月 16 日
Don't worry, MATLAB backslash detects automatically the type of your matrix and adapt the method. See "Algorithm" of doc page
All you need to do is make sure your matrix is exactly symmetric and not approximately. In case you have a doubt run as preprocess
A = 0.5*(A+A').

Torsten
Torsten 2022 年 3 月 16 日
編集済み: Torsten 2022 年 3 月 16 日
R = chol(A);
x = R\(R'\b)
I don't know if it's faster than the usual \.
  2 件のコメント
Bruno Luong
Bruno Luong 2022 年 3 月 16 日
chol requires matrix to be semi definite positive, I don't see OP state that.
Torsten
Torsten 2022 年 3 月 16 日
Ok, then you might want to test first for positive definiteness:
[R,flag] = chol(A)
if flag
x = R\(R'\b);
end
I don't have experience with SYMMLQ, but since it's iterative, I suspect that - under the aspect of efficiency - it comes into play only for really large problems.

サインインしてコメントする。


Steven Lord
Steven Lord 2022 年 3 月 16 日
You could call linsolve and tell linsolve explicitly that your coefficient matrix is symmetric.
If you have a sparse system of linear equations you could use symmlq.
If you're solving multiple systems with the same coefficient matrix but a collection of different right-hand sides you could create a decomposition object and tell it to use a specific decomposition ('chol' if the coefficient matrix is SPD, 'ldl' if it's just symmetric but not positive definite, etc.)

カテゴリ

Help Center および File ExchangeOperating on Diagonal Matrices についてさらに検索

製品


リリース

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by