Trong lập trình, đôi khi ta cần lưu trữ ma trận 2 chiều (2D) vào một mảng 1 chiều (1D) để tối ưu bộ nhớ hoặc tính toán địa chỉ nhanh hơn. Kích thước mảng 1D = rows * cols.
Có 2 cách ánh xạ chỉ số (i, j) của ma trận rows x cols sang chỉ số 1D:
1. Row-Major Order (Theo hàng - Ngôn ngữ C/C++ mặc định)
Lưu toàn bộ hàng 0, rồi hàng 1, ...
Công thức: index_1D = i * cols + j
2. Column-Major Order (Theo cột - Fortran, Matlab mặc định)
Lưu toàn bộ cột 0, rồi cột 1, ...
Công thức: index_1D = j * rows + i
Ví dụ minh họa
Ma trận 3x5 (rows=3, cols=5). Phần tử tại (i=0, j=2).
- Row-major: 0 * 5 + 2 = 2
- Col-major: 2 * 3 + 0 = 6
(Lưu ý: Code gốc ví dụ có lỗi logic khai báo mảng 3x5 nhưng gán giá trị 5 hàng. Code dưới đã sửa).
Chương trình minh họa
#include <iostream>
using namespace std;
int main() {
int rows = 3, cols = 5;
// Ma trận 3 hàng, 5 cột
int grid[3][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}
};
int i = 1, j = 3; // Phần tử grid[1][3] = 9
// Row-major (C/C++ standard layout)
int rowMajorIndex = i * cols + j;
cout << "Row-major index cua (" << i << "," << j << "): " << rowMajorIndex
<< " (Gia tri: " << grid[i][j] << ")" << endl;
// Column-major
int colMajorIndex = j * rows + i;
cout << "Col-major index cua (" << i << "," << j << "): " << colMajorIndex << endl;
// Minh họa truy cập mảng 1D
int flatArray[rows * cols];
// Copy theo Row-major (memcpy nhanh nhất vì C++ lưu Row-major)
// Hoặc gán thủ công:
for(int r=0; r
Đầu ra
Row-major index cua (1,3): 8 (Gia tri: 9)
Col-major index cua (1,3): 11
Tru cap flatArray[8] = 9