Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
2024.0.0 - English


backslash

(\) left matrix division: Exact or least square solution

Syntax

X = A \ B

Description

Backslash is the left matrix division: X=A\B is a solution to A*X=B.

If A is square and non-singular X=A\B is equivalent to X=inv(A)*B in exact arithmetic, but the computations are more accurate and cheaper in floating point arithmetic. Hence, to compute the solution of the linear system of equations A*X=B, the backslash operator should be used, and the inv function should be avoided.

In the case where A is square, the solution X can be computed either from LU factorization or from a linear least squares solver. If the condition number of A is smaller than 1/(10*%eps) (i.e. if A is well conditioned), the LU factorization with row pivoting is used. If not (i.e. if A is poorly conditioned), then X is the minimum-norm solution which minimizes ||A*X-B|| using a complete orthogonal factorization of A (i.e. X is the solution of a linear least squares problem).

If A is not square, X is a least square solution, i.e. norm(A*X-B) is minimal (Euclidean norm). If A is full column rank, the least square solution, X=A\B, is uniquely defined (there is a unique X which minimizes norm(A*X-B)). If A is not full column rank, then the least square solution is not unique, and X=A\B, in general, is not the solution with minimum norm (the minimum norm solution is X=pinv(A)*B).

A.\B is the matrix with (i,j) entry A(i,j)\B(i,j). If A (or B) is a scalar A.\B is equivalent to A*ones(B).\B (or A.\(B*ones(A)).

A\.B is an operator with no predefined meaning. It may be used to define a new operator (see overloading) with the same precedence as * or /.

Examples

A=[
   9.   -36.    30.
  -36.   192.  -180.
   30.  -180.   180.
];
b=[
   3.
  -24.
   30.
];
x=A\b
A*x-b // close to zero

A=rand(3,2);
b=[1;1;1];
x=A\b;
y=pinv(A)*b;
x-y
A=rand(2,3);b=[1;1];
x=A\b;
y=pinv(A)*b;
x-y, A*x-b, A*y-b

// if rank is deficient
A=rand(3,1)*rand(1,2);
b=[1;1;1];
x=A\b;
y=pinv(A)*b;
A*x-b, A*y-b
A=rand(2,1)*rand(1,3);
b=[1;1];
x=A\b;
y=pinv(A)*b;
A*x-b, A*y-b

// A benchmark of several linear solvers

[A,descr,ref,mtype] = ReadHBSparse(SCI+..
   "/modules/umfpack/demos/bcsstk24.rsa");

b = zeros(size(A,1),1);

tic();
res = umfpack(A,'\',b);
mprintf('\nTime with umfpack: %.3f\n',toc());

tic();
res = linsolve(A,b);
mprintf('\ntime with linsolve: %.3f\n',toc());

tic();
res = A\b;
mprintf('\ntime with backslash: %.3f\n',toc());

See also

  • slash — (/) right divisions. System's feed back. Comments
  • lsq — linear least square solution of A*X=B with minimal norm(X)
  • inv — matrix inverse
  • pinv — pseudoinverse
  • linsolve — linear equation solver
  • umfpack — solve sparse linear system
  • datafit — Non linear (constrained) parametric fit of measured (weighted) data
  • kron .\. — Kronecker left and right divisions
  • overloading — display, functions and operators overloading capabilities

History

VersionDescription
5.5.0 The threshold level which switches between Gaussian Elimination with row pivoting and linear least squares when computing A\B is decreased from sqrt(eps) to eps.
Report an issue
<< Scilab keywords Scilab keywords brackets [,;] >>

Copyright (c) 2022-2024 (Dassault Systèmes)
Copyright (c) 2017-2022 (ESI Group)
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Tue Oct 24 14:30:01 CEST 2023