Solve systems of linear equations Ax = B for x
collapse all in page
Syntax
x = A\B
x = mldivide(A,B)
Description
example
x = A\B
solves the system of linear equations A*x = B
. The matrices A
and B
must have the same number of rows. MATLAB® displays a warning message if A
is badly scaled or nearly singular, but performs the calculation regardless.
If
A
is a scalar, thenA\B
is equivalent toA.\B
.If
A
is a squaren
-by-n
matrix andB
is a matrix withn
rows, thenx = A\B
is a solution to the equationA*x = B
, if it exists.If
A
is a rectangularm
-by-n
matrix withm ~= n
, andB
is a matrix withm
rows, thenA
\B
returns a least-squares solution to the system of equationsA*x= B
.x
may not be the minimum-norm solution.
x = mldivide(A,B)
isan alternative way to execute x
=
A
\B
,but is rarely used. It enables operator overloading for classes.
Examples
collapse all
System of Equations
Open Live Script
Solve a simple system of linear equations, A*x = B
.
A = magic(3);B = [15; 15; 15];x = A\B
x = 3×1 1.0000 1.0000 1.0000
Linear System with Singular Matrix
Open Live Script
Solve a linear system of equations A*x = b
involving a singular matrix, A
.
A = magic(4);b = [34; 34; 34; 34];x = A\b
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.306145e-17.
When rcond
is between 0
and eps
, MATLAB® issues a nearly singular warning, but proceeds with the calculation. When working with ill-conditioned matrices, an unreliable solution can result even though the residual (b-A*x)
is relatively small. In this particular example, the norm of the residual is zero, and an exact solution is obtained, although rcond
is small.
When rcond
is equal to 0
, the singular warning appears.
A = [1 0; 0 0];b = [1; 1];x = A\b
Warning: Matrix is singular to working precision.
x = 2×1 1 Inf
In this case, division by zero leads to computations with Inf
and/or NaN
, making the computed result unreliable.
Least-Squares Solution of Underdetermined System
Open Live Script
Solve a system of linear equations, A*x = b
.
A = [1 2 0; 0 4 3];b = [8; 18];x = A\b
x = 3×1 0 4.0000 0.6667
Linear System with Sparse Matrix
Open Live Script
Solve a simple system of linear equations using sparse matrices.
Consider the matrix equation A*x = B
.
A = sparse([0 2 0 1 0; 4 -1 -1 0 0; 0 0 0 3 -6; -2 0 0 0 2; 0 0 4 2 0]);B = sparse([8; -1; -18; 8; 20]);x = A\B
x = (1,1) 1.0000 (2,1) 2.0000 (3,1) 3.0000 (4,1) 4.0000 (5,1) 5.0000
Input Arguments
collapse all
A
, B
— Operands
vectors | full matrices | sparse matrices
Operands, specified as vectors, full matrices, or sparse matrices. A
and B
must have the same number of rows.
If
A
orB
has an integer data type, the other input must be scalar. Operands with an integer data type cannot be complex.
Data Types: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
| char
Complex Number Support: Yes
Output Arguments
collapse all
x
— Solution
vector | full matrix | sparse matrix
Solution, returned as a vector, full matrix, or sparse matrix.If A is an m
-by-n
matrixand B is an m
-by-p
matrix,then x
is an n
-by-p
matrix,including the case when p==1
.
If A
has full storage, x
isalso full. If A
is sparse, then x
hasthe same storage as B
.
Tips
The operators
/
and\
are related to each other by the equationB/A = (A'\B')'
.If
A
is a square matrix, thenA\B
is roughly equal toinv(A)*B
, but MATLAB processesA\B
differently and more robustly.If the rank of
A
is less than the number of columns inA
, thenx = A\B
is not necessarily the minimum-norm solution. You can compute the minimum-norm least-squares solution usingx = lsqminnorm(A,B)
orx = pinv(A)*B
.Use decomposition objects to efficiently solve a linear system multiple times with different right-hand sides.
decomposition
objects are well-suited to solving problems that require repeated solutions, since the decomposition of the coefficient matrix does not need to be performed multiple times.
Algorithms
collapse all
The versatility of mldivide
in solving linearsystems stems from its ability to take advantage of symmetries inthe problem by dispatching to an appropriate solver. This approachaims to minimize computation time. The first distinction the functionmakes is between full (also called “dense”)and sparse input arrays.
Algorithm for Full Inputs
The flow chart below shows the algorithm path when inputs A
and B
are full.
Algorithm for Sparse Inputs
If A
is full and B
issparse then mldivide
converts B
toa full matrix and uses the full algorithm path (above) to computea solution with full storage. If A
is sparse, thestorage of the solution x
is the same as that of B
and mldivide
followsthe algorithm path for sparse inputs,shown below.
References
[1] Gilbert, John R., and Tim Peierls. “Sparse Partial Pivoting in Time Proportional to Arithmetic Operations.” SIAM Journal on Scientific and Statistical Computing 9, no. 5 (September 1988): 862–874. https://doi.org/10.1137/0909058.
[2] Anderson, E., ed. LAPACK Users’ Guide. 3rd ed. Software, Environments, Tools. Philadelphia: Society for Industrial and Applied Mathematics, 1999. https://doi.org/10.1137/1.9780898719604.
[3] Davis, Timothy A. "Algorithm 832: UMFPACK V4.3 – an unsymmetric-pattern multifrontal method." ACM Transactions on Mathematical Software 30, no. 2 (June 2004): 196–199. https://doi.org/10.1145/992200.992206.
[4] Duff, Iain S. “MA57---a Code for the Solution of Sparse Symmetric Definite and Indefinite Systems.” ACM Transactions on Mathematical Software 30, no. 2 (June 2004): 118–144. https://doi.org/10.1145/992200.992202.
[5] Davis, Timothy A., John R. Gilbert, Stefan I. Larimore, and Esmond G. Ng. “Algorithm 836: COLAMD, a Column Approximate Minimum Degree Ordering Algorithm.” ACM Transactions on Mathematical Software 30, no. 3 (September 2004): 377–380. https://doi.org/10.1145/1024074.1024080.
[6] Amestoy, Patrick R., Timothy A. Davis, and Iain S. Duff. “Algorithm 837: AMD, an Approximate Minimum Degree Ordering Algorithm.” ACM Transactions on Mathematical Software 30, no. 3 (September 2004): 381–388. https://doi.org/10.1145/1024074.1024081.
[7] Chen, Yanqing, Timothy A. Davis, William W. Hager, and Sivasankaran Rajamanickam. “Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate.” ACM Transactions on Mathematical Software 35, no. 3 (October 2008): 1–14. https://doi.org/10.1145/1391989.1391995.
[8] Davis, Timothy A. “Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing Sparse QR Factorization.” ACM Transactions on Mathematical Software 38, no. 1 (November 2011): 1–22. https://doi.org/10.1145/2049662.2049670.
Extended Capabilities
Tall Arrays
Calculate with arrays that have more rows than fit in memory.
This function supports tall arrays with thelimitation:
For the syntax Z = X\Y
, the array X
must be a scalar or a tall matrix with the same number of rows as Y
.
For more information, see Tall Arrays for Out-of-Memory Data.
C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.
Usage notes and limitations:
For sparse matrix inputs, the language standard must be C99 or later.
GPU Code Generation
Generate CUDA® code for NVIDIA® GPUs using GPU Coder™.
Usage notes and limitations:
For sparse matrix inputs, the language standard must be C99 or later.
Thread-Based Environment
Run code in the background using MATLAB® backgroundPool
or accelerate code with Parallel Computing Toolbox™ ThreadPool
.
This function fully supports thread-based environments. For more information, see Run MATLAB Functions in Thread-Based Environment.
GPU Arrays
Accelerate code by running on a graphics processing unit (GPU) using Parallel Computing Toolbox™.
The mldivide
function partially supports GPU arrays. Some syntaxes of the function run on a GPU when you specify the input data as a gpuArray (Parallel Computing Toolbox). Usage notes and limitations:
If
A
is rectangular, then it must also be nonsparse.The MATLAB
mldivide
function prints a warning ifA
is badly scaled, nearly singular, or rank deficient. ThegpuArray
mldivide
is unable to check for this condition. Take action to avoid this condition.64-bit integers are not supported.
For more information, see Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Distributed Arrays
Partition large arrays across the combined memory of your cluster using Parallel Computing Toolbox™.
Usage notes and limitations:
The MATLAB
mldivide
function prints a warning ifA
is badly scaled, nearly singular, or rank deficient. The distributed arraymldivide
is unable to check for this condition. Take action to avoid this condition.
For more information, see Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox).
Version History
Introduced before R2006a
expand all
R2024a: Improved performance with tridiagonal matrices
The mldivide
function shows improved performance when solving linear systems A*x = b
with a full tridiagonal coefficient matrix A
. mldivide
now detects tridiagonal structures in both dense and sparse matrices and uses a specific solver for these cases.
Previously, mldivide
detected tridiagonal structures only in sparse matrices and used the relevant solver only if more than half of the values were nonzero.
For example, this code solves a linear system specified for tridiagonal matrix D
. The code is about 6.5x faster than in the previous release.
function t = timingTestn = 5e3;A = randn(n);[L,D,P] = ldl(A,"upper");b = randn(n,1);f = @() D\b;t = timeit(f);end
The approximate execution times are:
R2023b: 0.13 s
R2024a: 0.02 s
The code was timed on a Windows® 11, AMD EPYC™ 74F3 24-Core Processor @ 3.19 GHz test system by calling the timingTest
function.
R2022b: Improved performance with small matrices
The mldivide
function shows improved performance when solving linear systems A*x = b
with a small coefficient matrix A
. The performance improvement applies to real matrices that are 16-by-16 or smaller, and complex matrices that are 8-by-8 or smaller.
For example, this code solves a linear system specified by a real 12-by-12 matrix. The code is about 1.7x faster than in the previous release.
function mldividePerfA = rand(12);for k = 1:1e5 x = A\A;endend
The approximate execution times are:
R2022a: 0.72 s
R2022b: 0.42 s
The code was timed on a Windows 10, Intel® Xeon® CPU W-2133 @ 3.60 GHz test system using the timeit
function:
timeit(@mldividePerf)
R2022a: LDL factorization no longer used for full matrices
The LDL factorization is no longer used for full matrices that are Hermitian indefinite. Instead, the LU factorization is used for these matrices.
See Also
mrdivide | ldivide | rdivide | inv | pinv | chol | lu | qr | ldl | linsolve | lsqminnorm | spparms | decomposition
Topics
- Array vs. Matrix Operations
- Operator Precedence
- Systems of Linear Equations
- Operator Overloading
- MATLAB Operators and Special Characters
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français
- United Kingdom (English)
Contact your local office