列优先与行优先

对于一个矩阵,在内存中有两种存储顺序:(下面图和表格摘自 https://en.wikipedia.org/wiki/Row-major_order)

对于下面的矩阵:

 \begin{bmatrix}11 & 12 & 13 \\21 & 22 & 23 \end{bmatrix}

可以有两种存储方式:左为列优先,右为行优先。

Column-major order
e.g., Fortran
Address Coordinates Value
0 [1,1] 11
1 [2,1] 21
2 [1,2] 12
3 [2,2] 22
4 [1,3] 13
5 [2,3] 23
Row-major order
e.g., C
Address Coordinates Value
0 [1,1] 11
1 [1,2] 12
2 [1,3] 13
3 [2,1] 21
4 [2,2] 22
5 [2,3] 23

顾名思义,列优先:优先按列存储,先存完第一列再存第二列,行优先同理。

C/C++中矩阵的存储为行优先,但Matlab中是列优先准则,在不同语言间读取数据时需要注意这点,同时在写Matlab时要尽量取一个二维数组的列,而不是行。

扩展到N维矩阵,列优先意味着存储时第一个维度先变化,即存储顺序为(0,0,0,...)、(1,0,0,...)、(max,0,0,...)、(0,1,0,...)、(1,1,0,...),

行优先意味着最后一个维度先变化。

p.s:在处理数据时,说明数据的顺序需要表明1)维度安排和 2)是否是行\列优先,这两个信息缺一不可。

p.s:caffe的Blob、numpy的array、OpenCV的Mat都是和C语言一样,是行优先的。

p.s:貌似只有Matlab中的矩阵是列优先。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值