spantwo 部分空間の合計および共通部分

## 呼び出し手順

    [Xp,dima,dimb,dim]=spantwo(A,B, [tol])

## 引数

A, B

  同数の行を有する実数または複素数の行列

Xp

  正方正則行列

dima, dimb, dim

  整数, 部分空間の次元

tol

  非負の実数

## 説明

同じ行数を有する行列 `A` および `B` を指定すると, 以下のような正方行列`Xp` (正則だが直交である必要はありません) を返します:

             [A1, 0]    (dim-dimb 行)
    Xp*[A,B]=[A2,B2]    (dima+dimb-dim 々)
             [0, B3]    (dim-dima 業)
             [0 , 0]

`inv(Xp)`の最初の`dima`列は range(`A`)に展開されます.

`inv(Xp)`の 列 `dim-dimb+1` から `dima` は range(A) と range(B)の共通部分に展開されます.

`inv(Xp)`の最初の`dim`列は, range(`A`)+range(`B`)に展開されます.

`inv(Xp)`の列`dim-dimb+1`から`dim` はrange(`B`)に展開されます.

行列 `[A1;A2]` は行フルランク(=rank(A))です. 行列`[B2;B3]`は行フルランク(=rank(B))です. 行列`[A2,B2]`は行フルランク(=rank(A inter B))です. 行`[A1,0;A2,B2;0,B3]` は行フルランク(=rank(A+B))です.

## 例

    A=[1,0,0,4;
       5,6,7,8;
       0,0,11,12;
       0,0,0,16];
    B=[1,2,0,0]';C=[4,0,0,1];
    Sl=ss2ss(syslin('c',A,B,C),rand(A));
    [no,X]=contr(Sl('A'),Sl('B'));CO=X(:,1:no);  //可制御部
    [uo,Y]=unobs(Sl('A'),Sl('C'));UO=Y(:,1:uo);  //不可観測部
    [Xp,dimc,dimu,dim]=spantwo(CO,UO);    //カルマン分解
    Slcan=ss2ss(Sl,inv(Xp));

## 参照

- spanplus
- spaninter