# backslash

(\) 左行列除算.

## 呼び出し手順

    x=A\b

## 説明

バックスラッシュは左行列除算を定義します. `x=A\b` は `A*x=b`の解です.

`A` が正方で非特異の場合, `x=A\b` (唯一の解) は `x=inv(A)*b` と等価です(しかし,計算コストははるかに小さくなります).

`A` が正方でない場合, `x` は最小二乗解となります. すなわち, `norm(A*x-b)` は最小値 (ユークリッドノルム)となります. `A` が列フルランクの場合,最小二乗解, `x=A\b`, は 唯一の解 (`norm(A*x-b)`を最小化する唯一の `x`が存在)となります. `A` が列フルランクでない場合, 最小二乗解は唯一ではなくなり, `x=A\b`は一般に最小ノルム解ではなくなります (最小ノルム解は `x=pinv(A)*b`です).

`A.\B` は`(i,j)` エントリが `A(i,j)\B(i,j)`となる行列となります. `A.\B` は `A*ones(B).\B` (または `A.\(B*ones(A))` と等価になります.

`A\.B` は定義されていない演算子です. この演算子は, * または /.のように新しい演算子を定義する際に使用できます(オーバーロード参照).

## 例

    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
    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/examples/bcsstk24.rsa");

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

    tic();
    res = umfpack(A,'\',b);
    mprintf('\ntime needed to solve the system with umfpack: %.3f\n',toc());

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

    tic();
    res = A\b;
    mprintf('\ntime needed to solve the system with the backslash operator: %.3f\n',toc());

## 参照

- slash
- inv
- pinv
- percent
- ieee
- linsolve
- umfpack