はしくれエンジニアもどきのメモ

情報系技術・哲学・デザインなどの勉強メモ・備忘録です。

線形写像と基底の取替えの表現行列のメモ

線形写像と基底の取替えの表現行列のメモ

線形写像(mapping)と基底の取替えの表現行列での変換を図示化してメモ.

線形写像と行列

  • 線形写像$f:\mathbb{R}^{n} \to \mathbb{R}^{m}$
  • $\vec{x}=x_1 \vec{e}_{1} + \cdots + x_n \vec{e}_{n}$
  • $\vec{x}'=x_1' \vec{e}_{1} + \cdots + x_m' \vec{e}_{m}$

として


\begin{eqnarray}
\vec{x}'
= f(\vec{x})
&=& f(x_1 \vec{e}_{1} + \cdots + x_n \vec{e}_{n}) \\
&=& x_1 f(\vec{e}_{1}) + \cdots + x_n f(\vec{e}_{n}) \\
\begin{pmatrix}
\vec{e}_{1} \cdots  \vec{e}_{m}
\end{pmatrix}
\begin{pmatrix}
x_1' \\
\vdots\\
x_m'\\
\end{pmatrix}
&=& \begin{pmatrix}
f(\vec{e}_{1}) & \cdots & f(\vec{e}_{n})
\end{pmatrix}
\begin{pmatrix}
x_1  \\
\vdots \\
x_n
\end{pmatrix}\\\\
\mathbf{I}
\begin{pmatrix}
x_1' \\
\vdots\\
x_m'\\
\end{pmatrix}
&=&
\mathbf{F}
\begin{pmatrix}
x_1  \\
\vdots \\
x_n
\end{pmatrix}\\\\
\begin{pmatrix}
x_1' \\
\vdots\\
x_m'\\
\end{pmatrix}
&=&
\mathbf{F}
\begin{pmatrix}
x_1  \\
\vdots \\
x_n
\end{pmatrix}
\end{eqnarray}

これらは標準基底より

$$ \vec{x'} = \mathbf{F}\vec{x} $$

例. 回転行列

45度の回転行列を考える.

$f:\mathbb{R}^{2} \to \mathbb{R}^{2}$


\begin{eqnarray}
f(
\begin{pmatrix}
x \\
y
\end{pmatrix}
)
&=& \begin{pmatrix}
\cos{(45^{ \circ })} x - \sin{(45^{ \circ })} y \\
\sin{(45^{ \circ })} x  + \cos{(45^{ \circ })} y
\end{pmatrix}\\\\
&=& \begin{pmatrix}
\frac{1}{\sqrt{2}} x - \frac{1}{\sqrt{2}} y \\
\frac{1}{\sqrt{2}} x  + \frac{1}{\sqrt{2}} y
\end{pmatrix}\\\\
&=&
\begin{pmatrix}
\frac{1}{\sqrt{2}}  & - \frac{1}{\sqrt{2}}  \\
\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}}
\end{pmatrix}
\begin{pmatrix}
x \\
y
\end{pmatrix}
\end{eqnarray}
import scipy as sp
import matplotlib.pyplot as plt

%matplotlib notebook

plt.figure(figsize=(4, 4))
plt.axis("equal")

def f(x, y):
    rad = sp.deg2rad(45)
    mat = sp.matrix([[sp.cos(rad), -sp.sin(rad)],
                    [sp.sin(rad), sp.cos(rad)]])
    vec = mat * sp.matrix([[x],[y]])
    return sp.asarray(vec).reshape(-1)

# 基本ベクトル
arrowprops={
    'arrowstyle': '->',
    "linestyle": "-"
}
arrow_head = {
    "head_width": 0.05,
    "length_includes_head":True,
}
e1 = sp.array([1, 0])
e2 = sp.array([0, 1])
plt.arrow(0, 0, *e1, color="k", **arrow_head)
plt.text(e1[0]/2, e1[1]/2-.1,"$\\vec{e}_{1}$", color="k")
plt.arrow(0, 0, *e2, color="k", **arrow_head)
plt.text(e2[0]/2, e2[1]/2-.1,"$\\vec{e}_{2}$", color="k")

# f(e1), f(e2)
f_e1 = f(*e1)
f_e2 = f(*e2)
plt.arrow(0, 0, *f_e1, **arrow_head, linestyle="--", color="r")
plt.arrow(0,0, *f_e2, color="r", **arrow_head, linestyle="--")
plt.text(f_e1[0]-.2, f_e1[1]-.3, "$f(\\vec{e}_{1})$", color="r")
plt.text(*f_e2, "$f(\\vec{e}_{2})$", color="r")

# p(1,0)
vec_x = sp.array([1,0])
plt.scatter(*vec_x, color="k")
plt.text(vec_x[0] - .05, vec_x[1] - .12,"$x({},{})$".format(*vec_x), color="k")
f_vec_x = f(*vec_x)
plt.scatter(*f_vec_x, color="r")
plt.text(f_vec_x[0] - .3, f_vec_x[1]+.05,"$x'({:.3f},{:.3f})$".format(*f_vec_x), color="r")
plt.vlines(f_vec_x[0], 0, f_vec_x[0], linestyle="--")
plt.hlines(f_vec_x[1], 0, f_vec_x[1], linestyle="--")

plt.xlim(-1.2, 1.2)
plt.ylim(-1.2, 1.2)
plt.xlabel("$x_{1}$")
plt.ylabel("$x_{2}$")
plt.grid(True)
plt.tight_layout()
plt.savefig("rotate.png")
plt.show()

(1,0)の45度回転

基底A,Bに関する写像fの表現行列

写像前の基底$\mathbb{A}$から写像した後に基底$\mathbb{B}$に変更する場合

線形写像$f:\mathbb{R}^{n} \to \mathbb{R}^{m}$とし,

  • $\mathbb{R}^{n}$の基底$\mathcal{A} = { \vec{a}_{1}, \vec{a}_{2}, \cdots, \vec{a}_{n} }$
  • $\mathbb{R}^{m}$の基底$\mathcal{B} = { \vec{b}_{1}, \vec{b}_{2}, \cdots, \vec{b}_{m} }$

とするとき, 基底$\mathcal{A}$の基底ベクトルを写像した$f(\vec{a}_{1}), \cdots , f(\vec{a}_{n})$は基底$\mathcal{B}$の線形結合で表される.


\begin{eqnarray}
\left\{
\begin{array}{l}
f(\vec{a}_{1})
&=& f_{11} \vec{b}_{1} + f_{21} \vec{b}_{2} \cdots + f_{m1} \vec{b}_{m}
= \begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\begin{pmatrix}
f_{11}\\
f_{21}\\
\vdots \\
f_{m1}
\end{pmatrix} \\\\
f(\vec{a}_{2})
&=& f_{12} \vec{b}_{1} + f_{22} \vec{b}_{2} \cdots + f_{m2} \vec{b}_{m}
= \begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\begin{pmatrix}
f_{12}\\
f_{22}\\
\vdots \\
f_{m2}
\end{pmatrix} \\
\vdots \\\\
f(\vec{a}_{n})
&=& f_{1n} \vec{b}_{1} + f_{2n} \vec{b}_{2} \cdots + f_{mn} \vec{b}_{m}
= \begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\begin{pmatrix}
f_{1n}\\
f_{2n}\\
\vdots \\
f_{mn}
\end{pmatrix}
\end{array}
\right.
\end{eqnarray}

像$f(\vec{a}_{i}), (1 \leq i \leq n)$の基底$\mathcal{B}$での座標を行ベクトルとして並べた行列を, 基底$\mathcal{A}$と基底$\mathcal{B}$に関する$f$の表現行列という.

表現行列$\mathbf{F}$は,基底と線形写像とでは以下の関係にある.


\begin{eqnarray}
\begin{pmatrix}
f(\vec{a}_{1}) & f(\vec{a}_{2})&\cdots & f(\vec{a}_{n})
\end{pmatrix}
&=&
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\begin{pmatrix}
f_{11} & f_{12} & \cdots & f_{1n} \\
f_{21} & f_{22} & \cdots & f_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
f_{m1} & f_{m2} & \cdots & f_{mn}
\end{pmatrix} \\\\
&=& \begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\mathbf{F}
\end{eqnarray}

表現行列の導出は,以下になる.


\begin{eqnarray}
\mathbf{F}
=
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}^{-1}
\begin{pmatrix}
f(\vec{a}_{1}) & f(\vec{a}_{2})&\cdots & f(\vec{a}_{n})
\end{pmatrix}
\end{eqnarray}

線形写像$f: \mathbb{R}^{2} \to \mathbb{R}^{3}$

  • $\mathbb{R}^{2}$の基底$\mathcal{A}$
  • $\mathbb{R}^{3}$の基底$\mathcal{B}$

\mathcal{A} = \{ \vec{a}_{1}, \vec{a}_{2}  \}
=
\left\{
\begin{pmatrix}
1 \\
2
\end{pmatrix},
\begin{pmatrix}
2 \\
1
\end{pmatrix}
\right\} \\\\
 \mathcal{B} = \{ \vec{b}_{1}, \vec{b}_{2}, \vec{b}_{3}  \} = \{ \vec{e}_{1}, \vec{e}_{2}, \vec{e}_{3}  \}
=\left\{
\begin{pmatrix}
1 \\
0\\
0
\end{pmatrix},
\begin{pmatrix}
0 \\
1\\
0
\end{pmatrix},
\begin{pmatrix}
0 \\
0\\
1
\end{pmatrix}
\right\}

線形写像


f\left(
\begin{pmatrix}
x\\
y
\end{pmatrix}
\right)
=
\begin{pmatrix}
x+2y\\
-3x\\
2x-y
\end{pmatrix}

としたときの写像fの表現行列はどうなるか.


\begin{eqnarray}
\begin{pmatrix}
f(\vec{a}_{1}) & f(\vec{a}_{2}) & \cdots & f(\vec{a}_{n})
\end{pmatrix}
&=&
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\mathbf{F} \\
\mathbf{F} &=&
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}^{-1}
\begin{pmatrix}
f(\vec{a}_{1}) & f(\vec{a}_{2}) & \cdots & f(\vec{a}_{n})
\end{pmatrix}
\end{eqnarray}

より,


\begin{pmatrix}
f(\vec{a}_{1}) & f(\vec{a}_{2})
\end{pmatrix}
=
\begin{pmatrix}
5 & 4\\
-3 & -6\\
0 & 3
\end{pmatrix}

写像先の基底を並べた行列


\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \vec{b}_{3}
\end{pmatrix}
=
\begin{pmatrix}
1 & 0 & 0\\
0 & 1 & 0\\
0 & 0 & 1\\
\end{pmatrix}
= \mathbf{I}

よって,


\begin{eqnarray}
\mathbf{F}
&=&
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \vec{b}_{3}
\end{pmatrix}^{-1}
\begin{pmatrix}
f(\vec{a}_{1}) & f(\vec{a}_{2})
\end{pmatrix} \\\\
&=& \mathbf{I}^{-1}
\begin{pmatrix}
5 & 4\\
-3 & -6\\
0 & 3
\end{pmatrix}\\\\
&=&
\begin{pmatrix}
5 & 4\\
-3 & -6\\
0 & 3
\end{pmatrix}
\end{eqnarray}

表現行列をpythonで導出:

import scipy as sp
from scipy import linalg


def f(x, y):
    mat = sp.matrix([[x+2*y],
                    [-3*x],
                    [2*x-y]])
    return mat

fa = sp.c_[f(1, 2), f(2,1)]
print("fa:", fa)

B = sp.c_[sp.matrix([[1],
                    [0],
                    [0]]),
         sp.matrix([[0],
                    [1],
                    [0]]),
         sp.matrix([[0],
                    [0],
                    [1]])]
print("B:", B)

F = linalg.inv(B) * fa
F
> fa: [[ 5  4]
 [-3 -6]
 [ 0  3]]
> B: [[1 0 0]
 [0 1 0]
 [0 0 1]]
> matrix([[ 5.,  4.],
        [-3., -6.],
        [ 0.,  3.]])

基底ベクトルの可視化

import matplotlib.pyplot as plt

plt.figure(figsize=(5,5))
plt.axis("equal")

# 基本ベクトル
arrow_head = {
    "head_width": 0.05,
    "head_width": 0.05,
    "length_includes_head":True,
}
vec_basic1 = sp.array([1, 0])
vec_basic2 = sp.array([0, 1])
plt.arrow(0, 0, *vec_basic1, color="k", **arrow_head)
plt.text(vec_basic1[0]/2, vec_basic1[1]/2-.1,"$\\vec{e}_{1}$", color="k")
plt.arrow(0, 0, *vec_basic2, color="k", **arrow_head)
plt.text(vec_basic2[0]/2, vec_basic2[1]/2-.1,"$\\vec{e}_{2}$", color="k")

# basis
vec_a1 = sp.array([1, 2])
vec_a2 = sp.array([2, 1])
plt.arrow(0, 0, *vec_a1, color="r", **arrow_head)
plt.text(vec_a1[0]/2, vec_a1[1]/2-.1,"$\\vec{a}_{1}$", color="r")
plt.arrow(0, 0, *vec_a2, color="b", **arrow_head)
plt.text(vec_a2[0]/2, vec_a2[1]/2-.1,"$\\vec{a}_{2}$", color="b")


plt.xlim(-.2, 2.2)
plt.ylim(-.2, 2.2)
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()

基底ベクトルの可視化

表現行列と座標

線形写像$f: \mathbb{R}^{n} \to \mathbb{R}^{m}$ で, $\vec{y}=f(\vec{x})$とし,$\mathbb{R}^{n}, \mathbb{R}^{m}$の基底をそれぞれ


\mathcal{A}=\{ \vec{a}_{1}, \cdots , \vec{a}_{n} \} \\\\
\mathcal{B}=\{ \vec{b}_{1}, \cdots , \vec{b}_{m} \}

とする.

基底$\mathcal{A}, \mathcal{B}$に関する$f$の表現行列を$\mathbf{F}$とし, 基底$\mathcal{A}$に関する$\vec{x}$の座標, 基底$\mathcal{B}$に関する$\vec{y}$の座標をそれぞれ


\begin{pmatrix}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{pmatrix},
\begin{pmatrix}
y_{1} \\
y_{2} \\
\vdots \\
y_{m}
\end{pmatrix}

つまり,$\vec{x} \in \mathbb{R}^{n}, \vec{y} \in \mathbb{R}^{m}$が成立.


\vec{x} = x_{1} \vec{a}_{1} + x_{2} \vec{a}_{2} + \cdots + x_{n} \vec{a}_{n} \\
\vec{y} = y_{1} \vec{b}_{1} + y_{2} \vec{b}_{2} + \cdots + y_{m} \vec{b}_{m} \\

基底$\mathcal{B}$に関する$\vec{y}$の座標, 基底$\mathcal{A}$に関する$\vec{x}$の座標と表現行列には次が成り立つ.


\begin{eqnarray}
\begin{pmatrix}
y_{1} \\
y_{2} \\
\vdots \\
y_{m}
\end{pmatrix}
=
\mathbf{F}
\begin{pmatrix}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{pmatrix}
\end{eqnarray}

proof:


\begin{eqnarray}
f(\vec{x})
&=& f(x_{1} \vec{a}_{1} + x_{2} \vec{a}_{2} + \cdots + x_{n} \vec{a}_{n} ) \\
&=& x_{1}f(\vec{a}_{1}) + x_{2} f(\vec{a}_{2}) + \cdots + x_{n} f(\vec{a}_{n} ) \\
&=&
\begin{pmatrix}
f(\vec{a}_{1}) & f(\vec{a}_{2}) & \cdots & f(\vec{a}_{n} )
\end{pmatrix}
\begin{pmatrix}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{pmatrix}\\
&=&
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\mathbf{F}
\begin{pmatrix}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{pmatrix}
\end{eqnarray}

また,


\begin{eqnarray}
f(\vec{x})
&=& \vec{y}\\
&=&
y_{1} \vec{b}_{1} + y_{2} \vec{b}_{2} + \cdots + y_{m} \vec{b}_{m}\\\\
&=&
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\begin{pmatrix}
y_{1} \\
y_{2} \\
\vdots \\
y_{m}
\end{pmatrix}
\end{eqnarray}

上式と下式は等価より


\begin{eqnarray}
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\begin{pmatrix}
y_{1} \\
y_{2} \\
\vdots \\
y_{m}
\end{pmatrix}
&=&
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2} & \cdots & \vec{b}_{m}
\end{pmatrix}
\mathbf{F}
\begin{pmatrix}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{pmatrix} \\\\
\begin{pmatrix}
y_{1} \\
y_{2} \\
\vdots \\
y_{m}
\end{pmatrix}
&=&
\mathbf{F}
\begin{pmatrix}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{pmatrix}
\end{eqnarray}

参考: 【線形代数】線形変換の表現行列と基底の変換行列 - ヨッシーの日記

2つの基底


\mathcal{A} = \{
\vec{a}_{1} =
\begin{pmatrix}
1 \\
1
\end{pmatrix}
,
\vec{a}_{1} =
\begin{pmatrix}
-1 \\
1
\end{pmatrix}
\} \\\\
\mathcal{B} = \{
\vec{e}_{1} =
\begin{pmatrix}
1 \\
0
\end{pmatrix}
,
\vec{e}_{1} =
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\}

f(\begin{pmatrix}
x \\
y
\end{pmatrix}))
=
\begin{pmatrix}
x+y \\
x-y
\end{pmatrix}

\vec{a}_{(1,0)} = 1\cdot \vec{a}_{1} + 0\cdot \vec{a}_{2}\\\\
f(\vec{a}_{(1,0)} ) = 1\cdot f(\vec{a}_{1})
=
\begin{pmatrix}
2\\
0
\end{pmatrix}
=
\begin{pmatrix}
\vec{e}_{1} & \vec{e}_{2}
\end{pmatrix}
\begin{pmatrix}
2\\
0
\end{pmatrix}

基底$\mathcal{A},\mathcal{B}$に関するfの表現行列は,


\mathbf{F}_{\mathcal{A},\mathcal{B}} =
\begin{pmatrix}
e_{1}& e_{2}\\
\end{pmatrix}^{-1}
\begin{pmatrix}
f(a1)& f(a2)
\end{pmatrix}
=
\begin{pmatrix}
2&0\\
0&-2\\
\end{pmatrix}

より,


\begin{pmatrix}
x'\\
y'\\
\end{pmatrix}
=
\mathbf{F}_{\mathcal{A},\mathcal{B}}
\begin{pmatrix}
1\\
0\\
\end{pmatrix}
=
\begin{pmatrix}
2\\
0
\end{pmatrix}

標準基底から基底$\mathcal{A}$で表す. これは後述する基底の取り替えでも可能.


\begin{pmatrix}
\vec{a}_{1} & \vec{a}_{2}
\end{pmatrix}
\begin{pmatrix}
x\\
y
\end{pmatrix}
=
\begin{pmatrix}
\vec{e}_{1} & \vec{e}_{2}
\end{pmatrix}
\begin{pmatrix}
2\\
0
\end{pmatrix}\\
\begin{pmatrix}
x\\
y
\end{pmatrix}
=
\begin{pmatrix}
\vec{a}_{1} & \vec{a}_{2}
\end{pmatrix}^{-1}
\begin{pmatrix}
\vec{e}_{1} & \vec{e}_{2}
\end{pmatrix}
\begin{pmatrix}
2\\
0
\end{pmatrix}
=
\begin{pmatrix}
1\\
-1
\end{pmatrix}
import matplotlib.pyplot as plt

plt.figure(figsize=(4,4))
plt.axis("equal")


def f(x, y):
    return sp.array([x+y,x-y])

# 基底
arrow_head = {
    "head_width": 0.05,
    "head_width": 0.05,
    "length_includes_head":True,
}

def vec_R(x, y):
    vec_a1 = sp.array([1, 1])
    vec_a2 = sp.array([-1, 1])

    return x * vec_a1 + y * vec_a2

# basis
vec_a1 = sp.array([1, 1])
vec_a2 = sp.array([-1, 1])
plt.arrow(0, 0, *vec_a1, color="r", **arrow_head, linestyle="--")
plt.text(vec_a1[0]/2, vec_a1[1]/2-.2,"$\\vec{a}_{1}$", color="r")
plt.arrow(0, 0, *vec_a2, color="r", **arrow_head, linestyle="--")
plt.text(vec_a2[0]/2, vec_a2[1]/2-.3,"$\\vec{a}_{2}$", color="r")

# f() f()
f_a1 = f(*vec_a1)
f_a2 = f(*vec_a2)
plt.arrow(0, 0, *f_a1, color="b", **arrow_head, linestyle="-")
plt.arrow(0, 0, *f_a2, color="b", **arrow_head, linestyle="-")
plt.text(*f_a1-0.3,"$f(\\vec{a}_{1})$", color="b")
plt.text(f_a2[0]-0.4,f_a2[1],"$f(\\vec{a}_{2})$", color="b")

#
vec_x = sp.array([1, 0])
plt.scatter(*vec_R(*vec_x), color="r")
plt.text(*vec_R(*vec_x),"$({},{})".format(*vec_x)+"_{\mathcal{A}}$", color="r")
plt.text(*(vec_R(*vec_x)+0.25),"$=({}, {})".format(*vec_R(*vec_x))+"_{\mathcal{B}}$", color="k")

# F
fa = sp.c_[f(1, 1), f(-1, 1)]
vec_a_mat = sp.c_[vec_a1,vec_a2]
F = linalg.inv(vec_a_mat).dot(fa)

f_vec_x = sp.asarray(F.dot(vec_x)).reshape(-1)
plt.scatter(*vec_R(*f_vec_x), color="b")
# plt.text(*vec_R(*f_vec_x),"$({}, {})_{\mathcal{A}}$", color="r")
plt.text(*(vec_R(*f_vec_x)-0.5),"$({}, {})".format(*f_vec_x)+"_{\mathcal{A}}$", color="b")
plt.text(*(vec_R(*f_vec_x)-.8),"=$({}, {})".format(*vec_R(*f_vec_x))+"_{\mathcal{B}}$", color="k")

plt.xlim(-2.2, 2.2)
plt.ylim(-2.2, 2.2)
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()

表現行列での座標変換

合成写像と表現行列

以下2つの線形写像を考える.


\begin{eqnarray}
\begin{pmatrix}
f(\vec{a}_{1})&f(\vec{a}_{2})&\cdots &f(\vec{a}_{n})
\end{pmatrix}
&=&
\begin{pmatrix}
\vec{b}_{1}& \vec{b}_{2}&\cdots &\vec{b}_{m}
\end{pmatrix}\mathbf{F}\\\\
\begin{pmatrix}
g(\vec{b}_{1})& g(\vec{b}_{2})&\cdots &g(\vec{b}_{m})
\end{pmatrix}
&=&
\begin{pmatrix}
\vec{c}_{1}& \vec{c}_{2}&\cdots &\vec{c}_{l}
\end{pmatrix}\mathbf{G}
\end{eqnarray}

2つのベクトル


\vec{x} \in \mathbb{R}^{n}\\\\
\vec{x} = x_{1}\vec{a}_{1} + \cdots + x_{n}\vec{a}_{n} \\\\
\vec{y} \in \mathbb{R}^{m}\\\\
\vec{y} = y_{1}\vec{b}_{1} + \cdots + y_{m}\vec{b}_{m} = f(\vec{x})

として,$g \circ f$の合成写像を考える.

合成写像の表現行列を$\mathbf{G}'$とすると以下が成立する.


\begin{eqnarray}
\begin{pmatrix}
g \circ f(\vec{a}_{1}) & \cdots & g \circ f(\vec{a}_{n} )
\end{pmatrix}
=
\begin{pmatrix}
\vec{c}_{1}& \vec{c}_{2}&\cdots &\vec{c}_{l}
\end{pmatrix}\mathbf{G'}
\end{eqnarray}

$\vec{x}$を合成写像して展開する.


\begin{eqnarray}
g \circ f(\vec{x})
&=& g \circ f(x_{1}\vec{a}_{1}+ \cdots + x_{n}\vec{a}_{n})\\\\
&=& x_{1} \cdot g \circ f(\vec{a}_{1})+ \cdots + x_{n} \cdot g\circ f(\vec{a}_{n})\\\\
&=&
\begin{pmatrix}
g \circ f(\vec{a}_{1}) & \cdots & g \circ f(\vec{a}_{n})
\end{pmatrix}
\begin{pmatrix}
x_{1} \\
\vdots \\
x_{n}
\end{pmatrix}\\\\
&=&
\begin{pmatrix}
\vec{c}_{1}& \vec{c}_{2}&\cdots &\vec{c}_{l}
\end{pmatrix}\mathbf{G'}
\begin{pmatrix}
x_{1} \\
\vdots \\
x_{n}
\end{pmatrix}
\end{eqnarray}

$g\circ f(\vec{x})$を$f(\vec{x})=\vec{y}$を利用して展開していく.


\begin{eqnarray}
g\circ f(\vec{x})
= g(f(\vec{x}))
&=& g(\vec{y}) \\\\
&=& g(y_{1}\vec{b}_{1} + \cdots + y_{m}\vec{b}_{m} )\\\\
&=& y_{1}g(\vec{b}_{1}) + \cdots + y_{m}g(\vec{b}_{m} )\\\\
&=&
\begin{pmatrix}
g(\vec{b}_{1}) & \cdots & g(\vec{b}_{m} )
\end{pmatrix}
\begin{pmatrix}
y_{1} \\
y_{2} \\
\vdots \\
y_{m}
\end{pmatrix}\\\\
&=&
\begin{pmatrix}
\vec{c}_{1}& \vec{c}_{2}&\cdots &\vec{c}_{l}
\end{pmatrix}\mathbf{G}
\begin{pmatrix}
y_{1} \\
y_{2} \\
\vdots \\
y_{m}
\end{pmatrix}\\\\
&=&
\begin{pmatrix}
\vec{c}_{1}& \vec{c}_{2}&\cdots &\vec{c}_{l}
\end{pmatrix}\mathbf{G}\mathbf{F}
\begin{pmatrix}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{pmatrix}
\end{eqnarray}

よって,両式を比較して

$$ \mathbf{G}' = \mathbf{G}\mathbf{F} $$

基底の取替え(線形変換を恒等変換とし基底を変更に相当)

$\mathbb{R}^{n}$の2組の基底

  • $\mathcal{A} = { \vec{a}_{1}, \vec{a}_{2}, \cdots, \vec{a}_{n} }$
  • $\mathcal{B} = { \vec{b}_{1}, \vec{b}_{2}, \cdots, \vec{b}_{n} }$

とするとき,基底$\mathcal{B}$は基底$\mathcal{A}$の線形結合で表される.


\begin{eqnarray}
\left\{
  \begin{array}{l}
  \vec{b}_{1}&=&\mathrm{id}(\vec{b}_{1}) = f_{11} \vec{a}_{1} + f_{21} \vec{a}_{2} \cdots + f_{n1} \vec{a}_{n}
  = \begin{pmatrix}
  \vec{a}_{1} & \vec{a}_{2} & \cdots & \vec{a}_{n}
  \end{pmatrix}
  \begin{pmatrix}
  f_{11}\\
  f_{21}\\
  \vdots \\
  f_{n1}
  \end{pmatrix} \\
  \vec{b}_{2} &=& \mathrm{id}(\vec{b}_{2}) = f_{12} \vec{a}_{1} + f_{22} \vec{a}_{2} \cdots + f_{n2} \vec{a}_{n}
  = \begin{pmatrix}
  \vec{a}_{1} & \vec{a}_{2} & \cdots & \vec{a}_{n}
  \end{pmatrix}
  \begin{pmatrix}
  f_{12}\\
  f_{22}\\
  \vdots \\
  f_{n2}
  \end{pmatrix} \\
  \vdots \\
  \vec{b}_{n}&=& id(\vec{b}_{n}) = f_{1n} \vec{a}_{1} + f_{2n} \vec{a}_{2} \cdots + f_{nn} \vec{a}_{n}
  = \begin{pmatrix}
  \vec{a}_{1} & \vec{a}_{2} & \cdots & \vec{a}_{n}
  \end{pmatrix}
  \begin{pmatrix}
  f_{1n}\\
  f_{2n}\\
  \vdots \\
  f_{nn}
  \end{pmatrix} \\
  \end{array}
  \right.
  \end{eqnarray}

基底$\mathcal{A}$での座標を行ベクトルとして並べた行列を, 基底$\mathcal{A}$から基底$\mathcal{B}$への基底の取り替え行列という.

基底$\mathcal{B}, \mathcal{A}$に関する恒等変換の表現行列と同値である.

基底の取替え行列は,基底と以下の関係にある.


\begin{eqnarray}
\begin{pmatrix}
\vec{b}_{1} & \cdots & \vec{b}_{n}
\end{pmatrix}
&=&
\begin{pmatrix}
\vec{a}_{1} & \cdots & \vec{a}_{n}
\end{pmatrix}
\begin{pmatrix}
f_{11} & f_{12} & \cdots & f_{1n}\\
f_{21} & f_{22} & \cdots & f_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
f_{n1} & f_{n2} & \cdots & f_{nn} \\
\end{pmatrix}\\
&=&
\begin{pmatrix}
\vec{a}_{1} & \cdots & \vec{a}_{n}
\end{pmatrix}
\mathbf{F}
\end{eqnarray}

導出は,


\begin{eqnarray}
\mathbf{F}
&=&
\begin{pmatrix}
\vec{a}_{1} & \cdots & \vec{a}_{n}
\end{pmatrix}^{-1}
\begin{pmatrix}
\vec{b}_{1} & \cdots & \vec{b}_{n}
\end{pmatrix}
\end{eqnarray}

基底の取替え行列と線形写像の表現行列

線形写像$f:\mathbb{R}^{n} \to \mathbb{R}^{m}$ とし,各基底を

  • $\mathbb{R}^{n}$の基底$\mathcal{A} = { \vec{a}_{1}, \cdots ,\vec{a}_{n} }, \mathcal{B} = { \vec{b}_{1}, \cdots ,\vec{b}_{n} }$
  • $\mathbb{R}^{m}$の基底$\mathcal{C} = { \vec{c}_{1}, \cdots ,\vec{c}_{m} }, \mathcal{D} = { \vec{d}_{1}, \cdots ,\vec{d}_{m} }$

線形写像$f: \mathbb{R}^{n}\to \mathbb{R}^{m}$とし,

  • 基底$\mathcal{A}, \mathcal{C}$に関するfの表現行列$\mathbf{F}$
  • 基底$\mathcal{B}, \mathcal{D}$に関するfの表現行列$\mathbf{G}$

  • 基底$\mathcal{A}$から$ \mathcal{B}$への取り替え行列$\mathbf{P}$ (基底$ \mathcal{B},\mathcal{A}$に関する恒等変換idの表現行列)

  • 基底$\mathcal{C}$から$\mathcal{D}$への取り替え行列$\mathbf{Q}$ (基底$ \mathcal{D},\mathcal{C}$に関する恒等変換idの表現行列)

$$ \require{AMScd} \begin{CD} \mathcal{A} @<{id_n: \mathbf{P}}<< \mathcal{B} \\ @V{f: \mathbf{F}}VV {} @VV{f: \mathbf{G}}V \\ \mathcal{C} @<<{id_{m}: \mathbf{Q}}< \mathcal{D} \end{CD} $$

基底$\mathcal{B}, \mathcal{D}$に関するfの表現行列$\mathbf{G}$を他の行列で表すと, 表現行列$\mathbf{G}$は以下の関係が成り立つ.


\begin{pmatrix}
f(\vec{b}_{1})&\cdots&f(\vec{b}_{n})
\end{pmatrix}
=
\begin{pmatrix}
\vec{d}_{1} & \cdots & \vec{d}_{m}
\end{pmatrix}
\mathbf{G}

任意のベクトル$\vec{x} \in \mathbb{R}^{n}$とし,基底で次のような座標で表せるとする.


\vec{x} = \alpha_{1} \vec{a}_{1} + \cdots + \alpha_{n} \vec{a}_{n}
= \beta_{1} \vec{b}_{1} + \cdots + \beta_{n} \vec{b}_{n}

基底Bで表した$\vec{x}$の$f(\vec{x})$を$\mathcal{D}$で表すと,


f(\vec{x}) = f(\beta_{1} \vec{b}_{1} + \cdots + \beta_{n} \vec{b}_{n}) \\\\
= \beta_{1}f( \vec{b}_{1}) + \cdots + \beta_{n} f(\vec{b}_{n})\\\\
=
\begin{pmatrix}
f( \vec{b}_{1}) &  \cdots & f(\vec{b}_{n})
\end{pmatrix}
\begin{pmatrix}
\beta_{1}\\
\vdots \\
\beta_{n}
\end{pmatrix}\\\\
=
\begin{pmatrix}
\vec{d}_{1} & \cdots & \vec{d}_{m}
\end{pmatrix}
\mathbf{G}
\begin{pmatrix}
\beta_{1}\\
\vdots \\
\beta_{n}
\end{pmatrix}

基底Aで表した$\vec{x}$の$f(\vec{x})$を$\mathcal{D}$で表すと,


f(\vec{x}) = f(\alpha_{1} \vec{a}_{1} + \cdots + \alpha_{n} \vec{a}_{n}) \\\\
= \alpha_{1}f( \vec{a}_{1}) + \cdots + \alpha_{n} f(\vec{a}_{n})\\\\
=
\begin{pmatrix}
f( \vec{a}_{1}) &  \cdots & f(\vec{a}_{n})
\end{pmatrix}
\begin{pmatrix}
\alpha_{1}\\
\vdots \\
\alpha_{n}
\end{pmatrix}

基底$\mathcal{A}$から$ \mathcal{B}$への取り替え行列$\mathbf{P}$ (基底$ \mathcal{B},\mathcal{A}$に関する恒等変換idの表現行列) より,座標は,


\begin{pmatrix}
\vec{b}_{1} & \cdots & \vec{b}_{n}
\end{pmatrix}
=
\begin{pmatrix}
\vec{a}_{1} & \cdots & \vec{a}_{n}
\end{pmatrix}
\mathbf{P} \\
\vec{x} =
\begin{pmatrix}
\vec{a}_{1} & \cdots & \vec{a}_{n}
\end{pmatrix}
\mathbf{P}
\begin{pmatrix}
\beta_{1}\\
\vdots \\
\beta_{n}
\end{pmatrix}
=
\begin{pmatrix}
\vec{a}_{1} & \cdots & \vec{a}_{n}
\end{pmatrix}
\begin{pmatrix}
\alpha_{1}\\
\vdots \\
\alpha_{n}
\end{pmatrix}

から


\begin{pmatrix}
\alpha_{1}\\
\vdots \\
\alpha_{n}
\end{pmatrix}
= \mathbf{P}\begin{pmatrix}
\beta_{1}\\
\vdots \\
\beta_{n}
\end{pmatrix}

\begin{eqnarray}
f(\vec{x})
&=&
\begin{pmatrix}
f( \vec{a}_{1}) &  \cdots & f(\vec{a}_{n})
\end{pmatrix}
\begin{pmatrix}
\alpha_{1}\\
\vdots \\
\alpha_{n}
\end{pmatrix}\\\\
&=&
\begin{pmatrix}
f( \vec{a}_{1}) &  \cdots & f(\vec{a}_{n})
\end{pmatrix}
\mathbf{P}
\begin{pmatrix}
\beta_{1}\\
\vdots \\
\beta_{n}
\end{pmatrix}
\end{eqnarray}

\begin{pmatrix}
f( \vec{a}_{1}) &  \cdots & f(\vec{a}_{n})
\end{pmatrix}
=
\begin{pmatrix}
\vec{c}_{1} &  \cdots & \vec{c}_{m}
\end{pmatrix}
\mathbf{F}

より,


\begin{eqnarray}
f(\vec{x})
&=&
\begin{pmatrix}
f( \vec{a}_{1}) &  \cdots & f(\vec{a}_{n})
\end{pmatrix}
\mathbf{P}
\begin{pmatrix}
\beta_{1}\\
\vdots \\
\beta_{n}
\end{pmatrix} \\\\
&=&
\begin{pmatrix}
\vec{c}_{1} &  \cdots & \vec{c}_{m}
\end{pmatrix}
\mathbf{F}
\mathbf{P}
\begin{pmatrix}
\beta_{1}\\
\vdots \\
\beta_{n}
\end{pmatrix}
\end{eqnarray}

\begin{pmatrix}
\vec{d}_{1} &  \cdots & \vec{d}_{m}
\end{pmatrix}
=
\begin{pmatrix}
\vec{c}_{1} &  \cdots & \vec{c}_{m}
\end{pmatrix}
\mathbf{Q}

より,


\begin{pmatrix}
\vec{c}_{1} &  \cdots & \vec{c}_{m}
\end{pmatrix}
=
\begin{pmatrix}
\vec{d}_{1} &  \cdots & \vec{d}_{m}
\end{pmatrix}\mathbf{Q}^{-1}

\begin{eqnarray}
f(\vec{x})
&=&
\begin{pmatrix}
\vec{c}_{1} &  \cdots & \vec{c}_{m}
\end{pmatrix}
\mathbf{F}
\mathbf{P}
\begin{pmatrix}
\beta_{1}\\
\vdots \\
\beta_{n}
\end{pmatrix} \\\\
&=&
\begin{pmatrix}
\vec{d}_{1} &  \cdots & \vec{d}_{m}
\end{pmatrix}\mathbf{Q}^{-1}
\mathbf{F}
\mathbf{P}
\begin{pmatrix}
\beta_{1}\\
\vdots \\
\beta_{n}
\end{pmatrix}
\end{eqnarray}

よって,


\mathbf{G} =
\mathbf{Q}^{-1}
\mathbf{F}
\mathbf{P}

線形写像$f:\mathbb{R}^{2} \to \mathbb{R}^{3}$ とし,各基底を

  • $\mathbb{R}^{2}$の基底$\mathcal{A} $
  • $\mathbb{R}^{2}$の基底$\mathcal{B}$
  • $\mathbb{R}^{3}$の基底$\mathcal{C}$
  • $\mathbb{R}^{3}$の基底$\mathcal{D}$

\mathcal{A} = \{ \vec{a}_{1},\vec{a}_{2} \}= \{ \vec{e}_{1},\vec{e}_{2} \} =
\left\{
\begin{pmatrix}
1 \\
0
\end{pmatrix},
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\right\}\\\\
\mathcal{B} = \{ \vec{b}_{1}, \vec{b}_{2} \}
= \left\{
\begin{pmatrix}
1 \\
1
\end{pmatrix},
\begin{pmatrix}
-1 \\
1
\end{pmatrix}
\right\}\\\\
\mathcal{C} = \{ \vec{c}_{1}, \vec{c}_{2},\vec{c}_{3} \}
=
\left\{
\begin{pmatrix}
1 \\
1 \\
1 \\
\end{pmatrix},
\begin{pmatrix}
-1 \\
1\\
1\\
\end{pmatrix},
\begin{pmatrix}
1 \\
-1 \\
1
\end{pmatrix}
\right\} \\\\
\mathcal{D} = \{ \vec{d}_{1}, \vec{d}_{2}, \vec{d}_{3} \}
= \{ \vec{e}_{1},\vec{e}_{2}, \vec{e}_{3} \}
=
\left\{
\begin{pmatrix}
1 \\
0 \\
0 \\
\end{pmatrix},
\begin{pmatrix}
0 \\
1\\
0\\
\end{pmatrix},
\begin{pmatrix}
0 \\
0 \\
1
\end{pmatrix}
\right\}

とする.

線形写像$f: \mathbb{R}^{n}\to \mathbb{R}^{m}$とし,


f\left(
\begin{pmatrix}
x\\
y\\
\end{pmatrix}
\right)
=
\begin{pmatrix}
\cos{(45)} x - \sin{(45)} y\\
\sin{(45)}x + \cos{(45)} y \\
x+y
\end{pmatrix}\\
=
\begin{pmatrix}
\frac{1}{\sqrt{2}} x - \frac{1}{\sqrt{2}} y\\
\frac{1}{\sqrt{2}} x + \frac{1}{\sqrt{2}} y \\
x+y
\end{pmatrix}

$$ \require{AMScd} \begin{CD} \mathcal{A} @<{id_n: \mathbf{P}}<< \mathcal{B} \\ @V{f: \mathbf{F}}VV {} @VV{f: \mathbf{G}}V\\ \mathcal{C} @<<{id_{m}: \mathbf{Q}}< \mathcal{D} \end{CD} $$

各表現行列を

  • 基底$\mathcal{A}, \mathcal{C}$に関するfの表現行列$\mathbf{F}$
  • 基底$\mathcal{B}, \mathcal{D}$に関するfの表現行列$\mathbf{G}$

  • 基底$\mathcal{A}$から$ \mathcal{B}$への取り替え行列$\mathbf{P}$ (基底$ \mathcal{B},\mathcal{A}$に関する恒等変換idの表現行列)

  • 基底$\mathcal{C}$から$\mathcal{D}$への取り替え行列$\mathbf{Q}$ (基底$ \mathcal{D},\mathcal{C}$に関する恒等変換idの表現行列)

とする.

  • 基底$\mathcal{A}, \mathcal{C}$に関するfの表現行列$\mathbf{F}$を求める.

\begin{pmatrix}
f(\vec{a}_{1} ) & f(\vec{a}_{2} )
\end{pmatrix}
=
\begin{pmatrix}
\vec{c}_{1} & \vec{c}_{2} & \vec{c}_{3}
\end{pmatrix}
\mathbf{F}
\\
\mathbf{F} = \begin{pmatrix}
\vec{c}_{1} & \vec{c}_{2} & \vec{c}_{3}
\end{pmatrix}^{-1}
\begin{pmatrix}
f(\vec{a}_{1} ) & f(\vec{a}_{2} )
\end{pmatrix}\\
=
\begin{pmatrix}
1 & -1 & 1 \\
1 & 1 & -1 \\
1 & 1 & 1 \\
\end{pmatrix}^{-1}
\begin{pmatrix}
\frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}}\\
\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\
1 & 1
\end{pmatrix}\\
=
\begin{pmatrix}
0.70710678 & 0 \\
0.14644661 & 0.85355339 \\
0.14644661 & 0.14644661
\end{pmatrix}
import scipy as sp
from scipy import linalg


def f(x, y):
    rad = sp.deg2rad(45)
    mat = sp.matrix([[sp.cos(rad), -sp.sin(rad)],
                    [sp.sin(rad), sp.cos(rad)],
                    [1, 1]
                    ])
    vec = mat.dot(sp.array([x,y]))
    return sp.asarray(vec).reshape(-1)

vec_a1 = sp.array([1, 0])
vec_a2 = sp.array([0, 1])

vec_c1 = sp.array([1, 1, 1])
vec_c2 = sp.array([-1, 1, 1])
vec_c3 = sp.array([1, -1, 1])
C = sp.c_[vec_c1, vec_c2, vec_c3]
C
print(linalg.inv(C))

fa = sp.matrix(sp.c_[f(*vec_a1), f(*vec_a2)])
fa
F = linalg.inv(C).dot(fa)
F
> matrix([[0.70710678, 0.        ],
        [0.14644661, 0.85355339],
        [0.14644661, 0.14644661]])

基底$\mathcal{A}$から$ \mathcal{B}$への取り替え行列$\mathbf{P}$ (基底$ \mathcal{B},\mathcal{A}$に関する恒等変換idの表現行列)を求める.


\begin{eqnarray}
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2}
\end{pmatrix}
&=&
\begin{pmatrix}
\vec{a}_{1} & \vec{a}_{2}
\end{pmatrix}
\mathbf{P}
\\
\mathbf{P}
&=&
\begin{pmatrix}
\vec{a}_{1} & \vec{a}_{2}
\end{pmatrix}^{-1}
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2}
\end{pmatrix}\\
&=&
\begin{pmatrix}
\vec{e}_{1} & \vec{e}_{2}
\end{pmatrix}^{-1}
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2}
\end{pmatrix}\\
&=&
\mathbf{I}^{-1}
\begin{pmatrix}
\vec{b}_{1} & \vec{b}_{2}
\end{pmatrix}\\
&=&
\begin{pmatrix}
1 & -1 \\
1 & 1
\end{pmatrix}\\
\end{eqnarray}

基底$\mathcal{C}$から$\mathcal{D}$への取り替え行列$\mathbf{Q}$ (基底$ \mathcal{D},\mathcal{C}$に関する恒等変換idの表現行列)を求める.


\begin{eqnarray}
\begin{pmatrix}
\vec{d}_{1} & \vec{d}_{2} & \vec{d}_{3}
\end{pmatrix}
&=&
\begin{pmatrix}
\vec{c}_{1} & \vec{c}_{2} & \vec{c}_{3}
\end{pmatrix}
\mathbf{Q}
\\
\mathbf{Q}
&=&
\begin{pmatrix}
\vec{c}_{1} & \vec{c}_{2} & \vec{c}_{3}
\end{pmatrix}^{-1}
\begin{pmatrix}
\vec{d}_{1} & \vec{d}_{2} & \vec{d}_{3}
\end{pmatrix}
\\
&=&
\begin{pmatrix}
\vec{c}_{1} & \vec{c}_{2} & \vec{c}_{3}
\end{pmatrix}^{-1}
\begin{pmatrix}
\vec{e}_{1} & \vec{e}_{2} & \vec{e}_{3}
\end{pmatrix}\\
&=&
\begin{pmatrix}
\vec{c}_{1} & \vec{c}_{2} & \vec{c}_{3}
\end{pmatrix}^{-1}\mathbf{I} \\
&=&
\begin{pmatrix}
1 & -1 & 1 \\
1 & 1 & -1 \\
1 & 1 & 1 \\
\end{pmatrix}^{-1}\\
&=&
\begin{pmatrix}
\frac{1}{2} & \frac{1}{2} & 0 \\
-\frac{1}{2} & 0 & \frac{1}{2} \\
0 & -\frac{1}{2} & \frac{1}{2} \\
\end{pmatrix}
\end{eqnarray}
import scipy as sp
from scipy import linalg

vec_c1 = sp.array([1, 1, 1])
vec_c2 = sp.array([-1, 1, 1])
vec_c3 = sp.array([1, -1, 1])

C = sp.c_[vec_c1, vec_c2, vec_c3]
Q = linalg.inv(C)
Q
> array([[ 0.5,  0.5, -0. ],
       [-0.5,  0. ,  0.5],
       [ 0. , -0.5,  0.5]])

基底$\mathcal{B}, \mathcal{D}$に関するfの表現行列$\mathbf{G}$を求める


\begin{eqnarray}
\begin{pmatrix}
f(\vec{b}_{1} ) & f(\vec{b}_{2} )
\end{pmatrix}
&=&
\begin{pmatrix}
\vec{d}_{1} & \vec{d}_{2} & \vec{d}_{3}
\end{pmatrix}
\mathbf{G}
\\
\mathbf{G}
&=&
\begin{pmatrix}
\vec{d}_{1} & \vec{d}_{2} & \vec{d}_{3}
\end{pmatrix}^{-1}
\begin{pmatrix}
f(\vec{b}_{1} ) & f(\vec{b}_{2} )
\end{pmatrix}\\
&=&
\mathbf{I}^{-1}
\begin{pmatrix}
0& -1.41421356\\
1.41421356 &  0 \\
2 & 0
\end{pmatrix}\\
&=&
\begin{pmatrix}
0& -1.41421356\\
1.41421356 &  0 \\
2 & 0
\end{pmatrix}
\end{eqnarray}
vec_b1 = sp.array([1, 1])
vec_b2 = sp.array([-1, 1])
b_mat = sp.c_[f(*vec_b1), f(*vec_b2)]
b_mat
array([[ 0.        , -1.41421356],
       [ 1.41421356,  0.        ],
       [ 2.        ,  0.        ]])
P = sp.matrix(sp.c_[vec_b1, vec_b2])
G = linalg.inv(Q) * F * P
G
matrix([[ 2.22044605e-16, -1.41421356e+00],
        [ 1.41421356e+00,  0.00000000e+00],
        [ 2.00000000e+00,  0.00000000e+00]])

各基底ベクトルを可視化する.

# annoate https://matplotlib.org/3.1.1/tutorials/text/annotations.html

import scipy as sp
from scipy import linalg
from mpl_toolkits.mplot3d import Axes3D  # noqa: F401 unused import
import matplotlib.pyplot as plt

%matplotlib notebook

# project
def f(x, y):
    return sp.array([x * sp.cos(sp.deg2rad(45)) - y * sp.sin(sp.deg2rad(45)),
                     x * sp.sin(sp.deg2rad(45)) + y * sp.cos(sp.deg2rad(45)),
                     x+y])

arrowprops={'arrowstyle': '->',
            "linestyle": "--"
}
projectprops = {
    'arrowstyle': '-|>'
}

def arrow_dotted(ax, dxdy, xy=(0, 0), color=None):
    ax.annotate('', xy=dxdy, xytext=xy,
            arrowprops={'arrowstyle': '->',
                       "linestyle": "--",
                       "color": color})

def subplot_after(ax, xlim, ylim, title=""):
    ax.set_aspect('equal')
    ax.grid(True)
    ax.set_xlim(*xlim)
    ax.set_ylim(*ylim)
    ax.set_title(title)


# Set up a figure twice as tall as it is wide
fig = plt.figure(figsize=(6, 6))
plt.subplots_adjust(wspace=0.6, hspace=0.6)
# fig.suptitle('A tale of 2 subplots')

# A
ax = fig.add_subplot(2, 2, 1)
vec_a1 = sp.array([1, 0])
vec_a2 = sp.array([0, 1])
vec_a_mat = sp.matrix(sp.c_[vec_a1, vec_a2])
ax.quiver(*[0, 0], *vec_a1, angles = 'xy', scale_units = 'xy', scale = 1, width=.02, color="k")
ax.quiver(*[0, 0], *vec_a2, angles = 'xy', scale_units = 'xy', scale = 1, width=.02, color="k")
ax.text(*(vec_a1/2) - .15,"$\\vec{a}_{1}$", color="k")
ax.text(*(vec_a2/2) - .15,"$\\vec{a}_{2}$", color="k")
# (1, 0)= 1e1 + 0e2 in R^2の座標
vec_x = sp.array([1, 0])
ax.scatter(*vec_x, color="k")
ax.text(*vec_x, "$({},{})".format(*vec_x) + "_{\mathcal{A}}$", color="k")

# annotate
ax.annotate("$f: \mathbf{F}$",
            xytext=(0.5, -.35),
            xy=(0.5, -.5),
            textcoords="axes fraction",
            xycoords="axes fraction",
            va="bottom", ha="center",
            bbox=dict(boxstyle="round", fc="w"),
            annotation_clip=False,
            arrowprops=dict(arrowstyle="->"))

subplot_after(ax, xlim=(-.2, 1.2), ylim=(-.2, 1.2), title="")
ax.set_title("$\mathcal{A}$", y=-.25)

# B
ax = fig.add_subplot(2, 2, 2)
vec_b1 = sp.array([1, 1])
vec_b2 = sp.array([-1, 1])
vec_b_mat = sp.matrix(sp.c_[vec_b1, vec_b2])
ax.quiver(*[0, 0], *vec_b1, angles = 'xy', scale_units = 'xy', scale = 1, width=.02, color="r")
ax.quiver(*[0, 0], *vec_b2, angles = 'xy', scale_units = 'xy', scale = 1, width=.02, color="r")
ax.text(vec_b1[0], vec_b1[1]-.15, "$\\vec{b}_{1}$", color="r")
ax.text(vec_b2[0], vec_b2[1]-.4, "$\\vec{b}_{2}$", color="r")
arrow_dotted(ax, dxdy=vec_a1)
arrow_dotted(ax, dxdy=vec_a2)
ax.scatter(*vec_x, color="k")
# convert: a_coord = P b_coord
P = linalg.inv(vec_a_mat) * vec_b_mat
b_coord = linalg.inv(P).dot(vec_x)
ax.text(*vec_x-.4, "$({},{})".format(*b_coord) + "_{\mathcal{B}}$", color="r")
# annotate
ax.annotate("$id_{2}:\mathbf{P}$",
            xytext=(-.2, -.2),
            xy=(-.5, -.2),
            textcoords="axes fraction",
            xycoords="axes fraction",
            va="center", ha="center",
            bbox=dict(boxstyle="round", fc="w"),
            annotation_clip=False,
            arrowprops=dict(arrowstyle="->"))
ax.annotate("$f: \mathbf{G}$",
            xytext=(0.5, -.35),
            xy=(0.5, -.5),
            textcoords="axes fraction",
            xycoords="axes fraction",
            va="bottom", ha="center",
            bbox=dict(boxstyle="round", fc="w"),
            annotation_clip=False,
            arrowprops=dict(arrowstyle="->"))

subplot_after(ax,
              xlim=(-1.2, 1.2),
              ylim=(-1.2, 1.2),
              title="")
ax.set_title("$\mathcal{B}$", y=-.25)


# C
ax = fig.add_subplot(2, 2, 3, projection='3d')
vec_c1 = sp.array([1, 1, 1])
vec_c2 = sp.array([-1, 1, 1])
vec_c3 = sp.array([1, -1, 1])
ax.text(*vec_c1+.05, "$\\vec{c}_{1}$", color="b")
ax.text(*vec_c2-.4, "$\\vec{c}_{2}$", color="b")
ax.text(*vec_c3-.4, "$\\vec{c}_{3}$", color="b")
vec_c_mat = sp.matrix(sp.c_[vec_c1, vec_c2, vec_c3])
ax.quiver(*[0, 0, 0], *vec_c1, length=1, color="b")
ax.quiver(*[0, 0, 0], *vec_c2, length=1, color="b")
ax.quiver(*[0, 0, 0], *vec_c3, length=1, color="b")
ax.scatter3D(*sp.asarray(sp.r_[vec_x, 0]).reshape(-1), color="k")

# f(a1)f(a2)
fa = sp.matrix(sp.c_[f(*vec_a1), f(*vec_a2)])
ax.quiver(*[0,0,0], *sp.asarray(fa[:, 0]).reshape(-1), linestyles="--", color="k")
ax.quiver(*[0,0,0], *sp.asarray(fa[:, 1]).reshape(-1), linestyles="--", color="k")
ax.text(*(sp.asarray(fa[:, 0]).reshape(-1)/2-.2), "$f(\\vec{a}_{1})$", color="k")
ax.text(*(sp.asarray(fa[:, 1]).reshape(-1)/2), "$f(\\vec{a}_{2})$", color="k")

f_vec_x = sp.asarray(fa.dot(vec_x)).reshape(-1)
F = linalg.inv(vec_c_mat) * fa
print("F:", F)
c_coord = sp.asarray(F.dot(vec_x)).reshape(-1)
print("c:", c_coord)
ax.scatter3D(*f_vec_x, color="b")
ax.text(f_vec_x[0]-.8, f_vec_x[1], f_vec_x[2] + .2, "$({:.3f},{:.3f}, {:.3f})".format(*c_coord) + "_{\mathcal{C}}$", color="b")

ax.set_title("$\mathcal{C}$")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
ax.set_xlim(-1.2, 1.2)
ax.set_ylim(-1.2, 1.2)
ax.set_zlim(-1.2, 1.2)

# D
ax = fig.add_subplot(2, 2, 4, projection='3d')
ax.scatter3D(*sp.asarray(sp.r_[vec_x, 0]).reshape(-1), color="k")
vec_d1 = sp.array([1, 0, 0])
vec_d2 = sp.array([0, 1, 0])
vec_d3 = sp.array([0, 0, 1])
ax.text(*vec_d1+.05, "$\\vec{d}_{1}$", color="g")
ax.text(*vec_d2+.05, "$\\vec{d}_{2}$", color="g")
ax.text(*vec_d3+.05, "$\\vec{d}_{3}$", color="g")
vec_d_mat = sp.matrix(sp.c_[vec_d1, vec_d2, vec_d3])
ax.quiver(*[0, 0, 0], *vec_d1, length=1, color="g")
ax.quiver(*[0, 0, 0], *vec_d2, length=1, color="g")
ax.quiver(*[0, 0, 0], *vec_d3, length=1, color="g")
ax.scatter3D(*f_vec_x, color="b")

# f(b1),f(b2)
fb = sp.matrix(sp.c_[f(*vec_b1), f(*vec_b2)])
ax.quiver(*[0,0,0], *sp.asarray(fb[:, 0]).reshape(-1), linestyles="--", color="r")
ax.quiver(*[0,0,0], *sp.asarray(fb[:, 1]).reshape(-1), linestyles="--", color="r")
ax.text(*(sp.asarray(fb[:, 0]).reshape(-1)+.1), "$f(\\vec{b}_{1})$", color="r")
ax.text(*(sp.asarray(fb[:, 1]).reshape(-1)-.5), "$f(\\vec{b}_{2})$", color="r")

Q = linalg.inv(vec_c_mat) * vec_d_mat
d_coord = linalg.inv(Q).dot(c_coord)
ax.text(*(f_vec_x - .3), "$({:.2f},{:.2f}, {:.2f})".format(*d_coord) + "_{\mathcal{D}}$", color="g")

# annotate
ax.annotate("$id_{3}:\mathbf{Q}$",
            xytext=(-.2, 1.),
            xy=(-.5, 1.),
            textcoords="axes fraction",
            xycoords="axes fraction",
            va="center", ha="center",
            bbox=dict(boxstyle="round", fc="w"),
            annotation_clip=False,
            arrowprops=dict(arrowstyle="->"))

ax.set_title("$\mathcal{D}$")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
ax.set_xlim(-2.2, 2.2)
ax.set_ylim(-2.2, 2.2)
ax.set_zlim(-2.2, 2.2)

plt.savefig("mapping_basis.png")
# plt.tight_layout()
plt.show()

基底の取替えと線形写像