DOSEIの日記

技術メモ+日常ログ

部分空間の共通部分 (intersection of two subspaces)

ベクトル空間 ℝn 上の部分空間 A = ⟨ a1, ..., ap ⟩, B = ⟨ b1, ..., bq ⟩ を考える。 A と B の共通部分 C := A ∩ B は一般に部分空間である。 x ∈ C である場合、つまり x ∈ A かつ x ∈ B の場合、それぞれの部分空間を張る基底の座標で、それぞれ xA := Ax, xB := Bx とかける。ここで、 A := [ a1, ..., ap ], B := [ b1, ..., bq ] という基底を列として並べた行列である。

x = AxA = BxB ∈ ℝn ならば、 x ∈ C である。

拘束条件 AxABxB = [ A | −B ]x' = 0 より、 x' = [xA, xB ] が満たすべき条件は、 D := [ A | −B ] の零空間 (null space) に含まれることである。*1 D の零空間 N の基底を集めた行列を N とすると DN = O である。 N の上下 p 行、 q 行づつに分割した行列 NA, NB を考えると、 ANA = BNB が成り立つ。 C := ANA とすると、これが C の基底を並べた行列となる。

A と B が重ならない場合、つまり C = { 0 } の場合、 N = { 0 } となるので、基底は求まらない。したがって、 SVD などで零空間の基底を計算する際には、このチェックが必要となる。

*1:基底だから、負号には特に意味ないので、なくてもいい。