Solve systems of linear equations *Ax = B* for *x*

collapse all in page

## Syntax

`x = A\B`

`x = mldivide(A,B)`

## Description

`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, then`A\B`

is equivalent to`A.\B`

.If

`A`

is a square`n`

-by-`n`

matrix and`B`

is a matrix with`n`

rows, then`x = A\B`

is a solution to the equation`A*x = B`

, if it exists.If

`A`

is a rectangular`m`

-by-`n`

matrix with`m ~= n`

, and`B`

is a matrix with`m`

rows, then`A`

\`B`

returns a least-squares solution to the system of equations`A*x= B`

.`x`

may not be the minimum-norm solution.

example

`x = mldivide(A,B)`

is an 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.

`x = `*4×1* 1.5000 2.5000 -0.5000 0.5000

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 = `*5x1 sparse double column vector (5 nonzeros)* (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`

or`B`

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`

matrix and 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`

is also full. If `A`

is sparse, then `x`

has the same storage as `B`

.

## Tips

The operators

`/`

and`\`

are related to each other by the equation`B/A = (A'\B')'`

.If

`A`

is a square matrix, then`A\B`

is roughly equal to`inv(A)*B`

, but MATLAB processes`A\B`

differently and more robustly.If the rank of

`A`

is less than the number of columns in`A`

, then`x = A\B`

is not necessarily the minimum-norm solution. You can compute the minimum-norm least-squares solution using`x = lsqminnorm(A,B)`

or`x = 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 linear systems stems from its ability to take advantage of symmetries in the problem by dispatching to an appropriate solver. This approach aims to minimize computation time. The first distinction the function makes 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`

is sparse then `mldivide`

converts `B`

to a full matrix and uses the full algorithm path (above) to compute a solution with full storage. If `A`

is sparse, the storage of the solution `x`

is the same as that of `B`

and `mldivide`

follows the 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 the limitation:

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 supports GPU array input with these usage notes and limitations:

If

`A`

is rectangular, then it must also be nonsparse.The MATLAB

`mldivide`

function prints a warning if`A`

is badly scaled, nearly singular, or rank deficient. The`gpuArray`

`mldivide`

is unable to check for this condition. Take action to avoid this condition.

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 if`A`

is badly scaled, nearly singular, or rank deficient. The distributed array`mldivide`

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