matlab矩阵存储方式
a = 1:120;
b = reshape(a,[2,3,4,5]);
b(:,:,1,1)= 1 3 5
2 4 6
b是一个(2,3,4,5)的四维数组,它可以这么理解
[每一列有2个元素,每一矩阵有3列,每一页有4个矩阵,一共有5页]
(其中行,列大家都懂,页就像是几个矩阵叠起来写满一页)
科学计算的时候,一定要搞清楚自己数据的数据结构:每一行,每一列都是什么物理或数学意义,一般我们习惯以列或者矩阵为一个具有物理或数学意义的单位实体。那么我这个4维数据可以这么理解。
我有一个四维数组,它存了4×5个矩阵,每一个矩阵的大小为2×3,我想引用第n页第m个矩阵,就使用b(:,:,m,n)
可以看出,让matlab自己输出这个矩阵,它就是按照这种理解输出的,或者
我所存的数据是二维坐标点,共存了3×4×5个,我可以使用b(:,m,n,k)的形式引用某一个坐标
matlab中比元素高一级的数组的单位是“列向量”,matlab储存数据是“按列”储存的。
我们拿到一个矩阵,通常使用“第几行第几列”来引用它的一个数据元素,matlab可不是这么理解的。
matlab认为:“第几行”=“第几个列向量”, “第几列”=“列向量中的第几个元素”
所以我们来看看reshape函数对a做了些神马:
reshape为(2,3,4,5),matlab先把数据分成5页,每章有24个数据,再把一页的数据分为4个矩阵,每个矩阵有6个数据,这时第一个矩阵的数据应为1~6,这时候再把每一个矩阵的数据分为3行,所以每一列数据就变成有两个元素的列向量了。
所以如果你看到一个matlab矩阵为
[1,2,3;4,5,6]
那么它在matlab内存中的存储顺序应该为[1,4,2,5,3,6],这一点非常的重要。
a=1:120;
b=reshape(a,[2,3,4,5]);
b(:,:,1,1)
ans =
1 3 5
2 4 6
这里就可以看到并不是按照[1,2,3;4,5,6]的顺序进行排列的,所以牢记matlab存储数据是按照列向量进行存储的。
numpy中矩阵存储方式
a=np.array(range(1,121))
b=a.reshape((2,3,4,5))
b
array([[[[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]],
.........
[[101,102,103,104,105],
[106,107,108,109,110],
[111,112,113,114,115],
[116,117,118,119,120]]]])
对于这里的b的索引值,我们必须这样来理解:
[一共有两章,每一章有3页,每一页有4行,每一行有5个元素]