reshape 执行什么数学函数?

What mathematical function does reshape perform?

在 Python 和 MATLAB 中,您都可以使用名为 reshape() 的函数来更改矩阵的维度。

这是线性代数中的什么运算,这是基的变化,还是更简单的矩阵乘法,或者两者都不是?

这个函数与线性代数无关,它是一个简单的索引技巧。考虑以下(我将使用 MATLAB syntax, but in Python, especially using NumPy/SciPy,它的功能相同):

A = [1 2 3; 4 5 6]; % 2-by-3 matrix
B = reshape(A,3,2); % B is 3-by-2
B =
     1     5
     4     3
     2     6

所以实际上您在 A 中有 6 个索引:1 到 6,顺序为 column-major。重塑时,保持线性风格,只是重新排序。线性地,您的元素按升序排列:1 4 2 5 3 6,它们存储在连续的内存中。 'header' 之类的告诉程序这些连续元素是如何形成的。这就是为什么 reshape 几乎是免费的:它只改变了 header.

线性代数与此无关,这只是使某些编程任务更容易的数值技巧。

有关 MATLAB 中索引如何工作的更多信息,我推荐 this great Q/A

在引擎盖下,MATLAB 将 A(2,2) 转换为 A(4),即第四个线性索引,使用 sub2ind(),正是因为所有内容都存储为线性向量。重塑所做的只是告诉 header 元素 3 不再位于 A(1,2),而是更改为 A(3,1),因为它的外观发生了变化。

根据 python 文档 1,2,它只是拼凑数组(因此使 t 成为线性一维向量。然后,使用索引,它返回到定义大小的新数组。例如:

start_array = 
[1,2,3,4;
5,6,7,8;
9,10,11,12]

i_a = [1,2,3,4,5,6,7,8,9,10,11,12] %implicit, not visible for user

result_array = 
[i_a(1), i_a(6), i_a(11); 
i_a(5), i_a(10), i_a(4); 
i_a(9), i_a(3), i_a(8); 
i_a(2), i_a(7), i_a(12)]

您可以重塑的最简单矩阵是 2x2,但您会明白的。 (抱歉,Whosebug 不允许我插入图片或 LaTex,因此,您需要稍微吃点苦头才能阅读。)

我们从 A=[[a,b],[c,d]] 开始,我们想将其重新整形为 1x4 数组:[[a,b,c,d]]。你可以用代数的方式做到这一点:

[[1,0]] * A * [[1,0,0,0],[0,0,0,0]] + 
[[1,0]] * A * [[0,0,0,0],[0,1,0,0]] + 
[[0,1]] * A * [[0,0,1,0],[0,0,0,0]] + 
[[0,1]] * A * [[0,0,0,0],[0,0,0,1]]

*表示矩阵乘法。

每一项都是一致矩阵的乘积:1x2 * 2x2 * 2x4 得到形状为 1x4.

的结果

第一学期给你 [[a,0,0,0]],第二学期 [[0,b,0,0]],第三学期 [[0,0,c,0]] 和第四学期 [[0,0,0,d]].

将其推广到形状为 nxm 的任意 A 应该不会太难。您将需要 n*m 个项而不是 4 个项,因为您的重塑矩阵将为 1x(n*m)。每个术语都需要一致,因此,您需要一个形状为 1xn 的矩阵从左侧击中 A,并需要一个形状为 mx(n*m) 的矩阵从右侧击中 A。

如果您需要将形状为 nxm 的 A 重塑为形状 kxl,其中 k*l=n*m,您需要使用 kxn 从左侧击中 A矩阵,从右边开始有 mx(k*l) 个矩阵。