如何对高维矩阵进行转置?

在线性代数课程中,我们一般只需要对二维矩阵进行转置,这是非常简单的。但在编写代码时,我们可能遇到高维(三维、四维等)矩阵转置的问题,那么此时该如何对其进行转置呢?最关键的地方,就是搞清楚在转置过程中,什么位置关系是变化的,什么位置关系是不变的。下面举例说明。

三维矩阵

三位矩阵的转置比较简单,因为它的第二个维度是不发生变化的,实质上只是交换了第一个和第三个维度。

如下面这个 2 × 2 × 3 2\times 2\times 3 的矩阵:

[[[ 1.  2.  3.]
  [ 4.  5.  6.]]

 [[ 7.  8.  9.]
  [10. 11. 12.]]]

在这个矩阵中我们称每个 2 × 3 2\times 3 的小矩阵为一个矩阵块,2是这个矩阵块的行数,3是这个矩阵块的列数。也就是说,对于 2 × 2 × 3 2\times 2\times 3 的这个大矩阵,第一个维度表示矩阵块的个数,第二个维度表示矩阵块中行的个数,第三个维度表示矩阵块中列的个数。

对它进行转置时,我们要先明确转置后的矩阵形状为 3 × 2 × 2 3\times 2\times 2 。我们可以先把它的整体框架画出:

因为第二个维度是不发生变化的,所以每个矩阵块中的行不会变化,也就是说,1下面仍然是4,2下面仍然是5……

[[[  .   .]
  [  .   .]]

 [[  .   .]
  [  .   .]]
  
 [[  .   .]
  [  .   .]]]

因为第一个维度和第三个维度发生了变化,所以1后面不再是2,1和4下面不再是7和10。要实现这个变化,只需要将2和5与7和10交换一下即可,这就是转置后的第一个矩阵块,如此重复,得到转置后的矩阵为:

[[[  1.   7.]
  [  4.  10.]]

 [[  2.   8.]
  [  5.  11.]]
  
 [[  3.   9.]
  [  6.  12.]]]

四维矩阵

对于四维矩阵,我们可以先对中间两个维度进行转置,再对第一个和最后一个维度进行转置。
下面是一个形状为 2 × 2 × 2 × 2 2\times 2\times 2\times 2 的矩阵:

[[[[ 1.  2.]
   [ 3.  4.]]

  [[ 5.  6.]
   [ 7.  8.]]]


 [[[ 9. 10.]
   [11. 12.]]

  [[13. 14.]
   [15. 16.]]]]

我们先对中间两个维度转置,这样一来第一个维度就是不变的,所以我们可以将这个矩阵分成两个形状为 2 × 2 × 2 2\times 2\times 2 的矩阵分别转置,然后再合并在一起。

跟对三维矩阵进行转置的步骤一样,对于每个矩阵来说,只有列维度是不变的,也就是说,1后面仍然是2,但1下面不能是3,1和3下面也不再是5和7。所以,我们只要把3和4与5和6交换一下即可,最终得到矩阵:

[[[[ 1.  2.]
   [ 5.  6.]]

  [[ 3.  4.]
   [ 7.  8.]]]


 [[[ 9. 10.]
   [13. 14.]]

  [[11. 12.]
   [15. 16.]]]]

然后,我们要对第一个和最后一个维度进行转置,此时需要保证:1下面仍然是5,1和5下面仍然是3和7,1后面不再是2,1、5、3和7下面不再是9、13、11和15。所以,我们只需要将2、6、4、8与9、13、11、15交换一下即可,最终得到结果:

[[[[ 1.,  9.],
   [ 5., 13.]],

  [[ 3., 11.],
   [ 7., 15.]]],


 [[[ 2., 10.],
   [ 6., 14.]],

  [[ 4., 12.],
   [ 8., 16.]]]]
发布了145 篇原创文章 · 获赞 43 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_36758914/article/details/105488508
今日推荐