ldc / 转置矩阵

Created Fri, 14 Sep 2018 00:00:00 +0000 Modified Sun, 30 Mar 2025 16:00:22 +0000
796 Words

矩阵的转置,就是交换一个矩阵的行和列,这种操作在日常生活中使用的频率并不低。

$$ \newcommand\tuple[2]{\langle #1,#2 \rangle} \newcommand\quaternion[4]{\langle #1,#2,#3,#4 \rangle} \newcommand\pr{\mathrm{P_R}} \newcommand\br{\mathrm{R}} \newcommand\bo{\mathrm{O}} $$

设有偏序集 $(O, \preccurlyeq)$,有二元关系 $\br$ 以及偏序关系 $\pr$,其中:

$$ \pr := { \tuple{X}{Y} \mid O \supseteq \tuple{a}{b} \xrightarrow{\br} {X,Y} } $$

且有偏序集 $(S, \pr)$,及 $A \cup B \cup C \subseteq S$,则:

$$ (A,\pr) \cup (B,\pr) \cup (C,\pr) \subseteq (S,\pr) $$

此时偏序关系 $\pr$ 的偏序取决于偏序关系 $\preccurlyeq_O$,由此可得:

$$ O \times A \cup O \times B \cup O \times C \subseteq \br $$

此时将 $O$,$A$,$B$,$C$ 组成一个 $m \times n$ 的矩阵 $M$:

$$ M = \begin{bmatrix} O_1 & \dots & O_n \\ A_1 & \dots & A_n \\ B_1 & \dots & B_n \\ C_1 & \dots & C_n \end{bmatrix} $$

M = [O, A, B, C]

此时我要插入一行 $D \subset S$ 可以这样:

$$ M = \begin{bmatrix} O_1 & \dots & O_n \\ A_1 & \dots & A_n \\ B_1 & \dots & B_n \\ C_1 & \dots & C_n \\ D_1 & \dots & D_n \end{bmatrix} $$

M.append(D)

而当我要插入一列 $m$ 元组比如 $\quaternion{O_k}{A_k}{B_k}{C_k}$ 时,插入的次数就达到了 $\bo(m)$ 次。 考虑到新矩阵的所有行仍需满足 $O$ 上的偏序关系 $\preccurlyeq_O$,最坏则要搜索 $\bo(mn)$ 次。

当这种插入操作非常频繁时,则可以考虑对矩阵进行转置,即交换行和列:

$$ M^\top = { x \cup { x \xrightarrow{\br} S } \mid x \in M_O }, \qquad M^\top_{i,j} = M_{j,i} $$

$$\text{即:}\qquad \begin{bmatrix} O_1 & A_1 & B_1 & C_1 \\ \vdots & \vdots & \vdots & \vdots \\ O_n & A_n & B_n & C_n \end{bmatrix} $$

column = range(len(M[0]))
mapTo = lambda construct: lambda f, l: construct(map(f, l))
Mt = mapTo(list)(lambda i: mapTo(list)(lambda row: row[i], M), column)

转置后的矩阵 $M^\top$ 为一个 $n \times m$ 的矩阵。

由于我在处理数据的过程中使用的数据结构是列表而非集合,所以数据的偏序关系在最开始生成的时候就已经被确定下来了。

加上 Python 自身提供的 List-Comprehension 功能,转置的过程可以书写成更加简单的形式。

另外,如果在置转时将 $M^\top$ 中所有与 $O$ 持有二元关系 $\br$ 的元素组成一个 $m$ 元组,$M^\top$ 就能成为了一种非常方便操作的元组向量结构了:

$$ M^\top = { \big\langle \tau_i \big\rangle_{\tau \ \in \ M} \mid i \in M_O }, \qquad M^\top_{i,j} \equiv M_{j,i} $$

$$ \text{即:}\qquad \begin{bmatrix} \tau_1 \\ \vdots \\ \tau_n \end{bmatrix}, \qquad \tau \subseteq \quaternion{O}{A}{B}{C} $$

Mt = [tuple(row[i] for row in M) for i in column]

完整代码:https://gist.github.com/ldcc/23e64a7c01e95b49f912f39e5dd37bff