重塑执行什么数学功能?

时间:2019-04-08 20:00:08

标签: python matlab matrix reshape

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

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

3 个答案:

答案 0 :(得分:3)

此函数与线性代数无关,它是一个简单的索引技巧。考虑以下内容(我将使用MATLAB syntax,但在Python中,尤其是使用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,按列优先顺序排列。重塑时,将保留线性样式,仅对其进行重新排序。线性地,您的元素以1 4 2 5 3 6的升序排列,它们存储在连续的内存中。排序的“标题”告诉程序这些相邻元素的形状。这就是reshape几乎免费的原因:它仅更改标题。

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

有关MATLAB中的索引如何工作的更多信息,建议使用this great Q/A

在底层,MATLAB使用sub2ind()A(2:2)转换为A(4),即第四线性索引,正是因为所有内容都存储为线性向量。重塑的全部目的是告诉标头元素3不再位于A(1,2),而是因为其外观已更改为A(3,1)

答案 1 :(得分:1)

根据python文档 12,它只是使数组散乱(因此使ta为线性一维向量。然后使用索引,将其返回到定义大小的新数组。例如:

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)]

答案 2 :(得分:0)

您可以重塑的最简单的矩阵是 2x2,但您会明白的。 (抱歉,StackOverflow 不允许我插入图像或 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) 矩阵。