• 中文
    • 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.53w
  • 龙猫

    请登录之后再进行评论

    登录
    单栏布局 侧栏位置: