• 中文
    • English
  • 注册
  • 查看作者
    • 矩阵的行优先和列优先详解

      一.  简介:

      首先,我们来看一个二维数组,如下图:

      矩阵的行优先和列优先详解

      我们分别用符号代替文字:

      • 行数:M
      • 列数:N
      • 行号:i
      • 列号:j

      左边的二维数组就可以看成是M * N,M = 4,N = 3

      9这个元素就可以看成(i,j)=(2,1)

      同时,[M-1][N-1]可以当做二维数组的维数,该二维数组可以表示为a[3][2]

      二.  行优先

      我们将二维数组的所有元素按照列向量依次排行排列,第i + 1 个行向量紧跟在第i个行向量后面,就能得到数组元素存入一维数组的线性序列,如下图:

      矩阵的行优先和列优先详解

      二维数组中第(i,j)个元素,在一维数组的中的位置是:(i * N) + j,内存地址为:a + (i * N + j) * L

      其中L是元素的内存占用空间(int为4,double为8……)

      比如9这个元素,在二维数组中位置是(2,1),则在一维数组中的位置是(2 *3)+ 1 = 7,可以看到在一维数组中9的下标为7

      三.  列优先

      我们将二维数组的所有元素按照列向量依次排行排列,第j + 1 个列向量紧跟在第j个列向量后面,就能得到数组元素存入一维数组的线性序列,如下图:

      矩阵的行优先和列优先详解

      二维数组中第(i,j)个元素,在一维数组的中的位置是:(j * M) + i,内存地址为:a + (j * M + i) * L

      其中L是元素的内存占用空间(int为4,double为8……)

      比如9这个元素,在二维数组中位置是(2,1),则在一维数组中的位置是(1 * 4)+ 2 = 6,可以看到在一维数组中9的下标为6

      四.  代码实现

      #include <stdio.h>
      int main() {
      	int a[3][2];
      	printf("%X\n",a);//输出a的地址
      	printf("%X\n",&a[2][1]);
                                                               //M = 3,N = 2, i = 2,j = 1
      	int c = (int ) a + (2 * 2 + 1) * sizeof(int);    //a + (i * N + j) * L
      	printf("%X\n",c);                                //输出行优先下,a[2][1]的内存地址
      
      	int d = (int ) a + (1 * 3 + 2) * sizeof(int);    //a + (j * M + i) * L
      	printf("%X\n",d);                                //输出列优先下,a[2][1]的内存地址
      	return 0;
      }
      
      输出:
      60FEF0
      60FF04
      60FF04
      60FF04

       

       

       

       

    • 0
    • 0
    • 0
    • 1.4w
    • 龙猫

      请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: