【发布时间】:2012-02-19 07:29:00
【问题描述】:
我想知道是否存在存储在一维数组中的元素矩阵,如何访问参考元素上方和下方的数组元素。例如:假设有一个 3X3 矩阵,它总共有 9 个元素,但我对元素感兴趣 array[2][2](即二维数组)。我想访问数组[2][1] 和数组[2][3],但是在一维数组中。感谢cmets
【问题讨论】:
标签: c
我想知道是否存在存储在一维数组中的元素矩阵,如何访问参考元素上方和下方的数组元素。例如:假设有一个 3X3 矩阵,它总共有 9 个元素,但我对元素感兴趣 array[2][2](即二维数组)。我想访问数组[2][1] 和数组[2][3],但是在一维数组中。感谢cmets
【问题讨论】:
标签: c
良好的旧指针算法:如果数组是 N × M,则第二行的第一个(第 0 个)元素位于偏移量 M。通常,如果您以 C 方式线性化数组(第二个索引变化更快), 元素 a,b 将在偏移量 a*M + b 处。
【讨论】:
如果我理解正确,那么:
int arr[9]={0,1,2,3,4,5,6,7,8}; // You have 1D array
int (*mat)[3]=arr; //Convert it to int[][3]
mat[2][2]=5; //Change (for example) the last element to 5
请注意,C 数组是从 0 开始的,因此您没有 mat[2][3]。
【讨论】:
听起来您想将一维数组视为二维矩阵。然后给定一维数组中的位置,在上面的行中提供相同的列?如果是这样,请尝试以下操作
size_t GetRowAbove(size_t index, size_t arrayLength, size_t rowLength) {
size_t column = index / rowLength;
size_t row = (index - column) / rowLength;
return ((row - 1) * rowLength) + column;
}
size_t GetRowBelow(size_t index, size_t arrayLength, size_t rowLength) {
size_t column = index / rowLength;
size_t row = (index - column) / rowLength;
return ((row + 1) * rowLength) + column;
}
【讨论】:
#define ROW_LEN 3
int arr[9]={0,1,2,
3,4,5,
6,7,8}
int idx = 4;
int element = arr[idx];
int below = arr[idx + ROW_LEN];
int above = arr[idx - ROW_LEN];
只需注意第一行和最后一行,因为它们没有(分别)上方和下方的行。
【讨论】: