是否可以从 C 中的二维数组中切出一列
Is it possible to slice a column from 2d array in C
当我希望从 c
中的二维数组中切出一行时,我可以执行以下操作:
void PrintArray(int *arr, int arr_size);
int main(){
int arr[4][4] = {
{10, 13, 56, 66},
{23, 57, 59, 67},
{36, 70, 74, 75},
{40, 75, 80, 91}
};
PrintArray(arr[2], 4);
return 0;
}
void PrintArray(int *arr, int arr_size) {
int i;
for (i = 0; i < arr_size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
打印:
36 70 74 75
我想知道是否有可能以某种 elegant/efficient 方式按列执行相同的操作。
我可以转置矩阵并执行相同的操作,但这样做很麻烦。
注:
我怀疑这可能不可能,但我想知道是否有更有根据的答案来回答是否可能。
如果将数组转换为 (int*),则可以定义此函数:
void PrintCol (int *arr, int col, int row_size, int arr_size) {
int i;
for (i = col; i < arr_size; i += row_size) {
printf("%d ", arr[i]);
}
printf("\n");
}
并这样称呼它,假设您要打印列偏移量 1。
PrintCol((int*)arr, 1, 4, 16);
谁的输出应该是这样的:
$ gcc slice.c && ./a.out
13 57 70 75
您应该做的一件事是将 PrintArray for
循环与 PrintCol
.
中的循环进行比较
生成的程序集之间的唯一区别应该是 i
初始分配方式和 i
递增方式的说明。
从这个意义上说,PrintArray
确实更有效率,但幅度不大。 “转置矩阵加 PrintArray”的成本总是(?)大于“PrintCol”。
不存在这样优雅或有效的方法,因为数组本质上是原始内存,而矩阵是应用层概念。
碰巧可以通过让数组编号 n 衰减为指向第一个元素的指针来访问 4 int[4]
个数组,因为这就是方法项目保证在内存中布局(从 LS 地址到 MS 地址,“从左到右”)。但是没有特别优雅的技巧来做相反的事情,除了使用 arr[i][j]
.
访问每个数组项之外
值得注意的是,您可以选择在应用程序层上创建矩阵 mat [row][col]
或 mat[col][row]
。数组数组的最左边 dimension/index 不一定必须对应于应用程序中矩阵的数学定义。
当我希望从 c
中的二维数组中切出一行时,我可以执行以下操作:
void PrintArray(int *arr, int arr_size);
int main(){
int arr[4][4] = {
{10, 13, 56, 66},
{23, 57, 59, 67},
{36, 70, 74, 75},
{40, 75, 80, 91}
};
PrintArray(arr[2], 4);
return 0;
}
void PrintArray(int *arr, int arr_size) {
int i;
for (i = 0; i < arr_size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
打印:
36 70 74 75
我想知道是否有可能以某种 elegant/efficient 方式按列执行相同的操作。
我可以转置矩阵并执行相同的操作,但这样做很麻烦。
注:
我怀疑这可能不可能,但我想知道是否有更有根据的答案来回答是否可能。
如果将数组转换为 (int*),则可以定义此函数:
void PrintCol (int *arr, int col, int row_size, int arr_size) {
int i;
for (i = col; i < arr_size; i += row_size) {
printf("%d ", arr[i]);
}
printf("\n");
}
并这样称呼它,假设您要打印列偏移量 1。
PrintCol((int*)arr, 1, 4, 16);
谁的输出应该是这样的:
$ gcc slice.c && ./a.out
13 57 70 75
您应该做的一件事是将 PrintArray for
循环与 PrintCol
.
生成的程序集之间的唯一区别应该是 i
初始分配方式和 i
递增方式的说明。
从这个意义上说,PrintArray
确实更有效率,但幅度不大。 “转置矩阵加 PrintArray”的成本总是(?)大于“PrintCol”。
不存在这样优雅或有效的方法,因为数组本质上是原始内存,而矩阵是应用层概念。
碰巧可以通过让数组编号 n 衰减为指向第一个元素的指针来访问 4 int[4]
个数组,因为这就是方法项目保证在内存中布局(从 LS 地址到 MS 地址,“从左到右”)。但是没有特别优雅的技巧来做相反的事情,除了使用 arr[i][j]
.
值得注意的是,您可以选择在应用程序层上创建矩阵 mat [row][col]
或 mat[col][row]
。数组数组的最左边 dimension/index 不一定必须对应于应用程序中矩阵的数学定义。