Chuyển vị ma trận trong C, C++
Trong bài học này, bạn sẽ in ra ma trận chuyển vị bằng cách đổi vai trò của hàng và cột.
Giới thiệu
Chuyển vị ma trận là đổi hàng thành cột và cột thành hàng, tức là giá trị ở hàng i, cột j sẽ chuyển sang hàng j, cột i. Một ma trận 2 hàng 3 cột sau khi chuyển vị sẽ có 3 hàng 2 cột.
Những điểm quan trọng
- Luôn bật cảnh báo của trình biên dịch (compiler warning) và sửa hết các cảnh báo.
- Hiểu rõ kiểu dữ liệu và thời gian tồn tại (lifetime) của từng giá trị.
- Luôn kiểm tra dữ liệu đầu vào và giới hạn chỉ số của mảng.
Xem cách hoạt động
Nhấn transpose để đổi hàng thành cột. Trỏ vào một ô để xem vị trí mới và offset trong bộ nhớ.
Code ví dụ bằng C và C++
#include <stdio.h>
int main(void) {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
// Visit columns first to print the transposed shape.
for (int column = 0; column < 3; ++column) { for (int row = 0; row < 2; ++row) printf("%s%d", row ? " " : "", matrix[row][column]); puts(""); }
}
1 4
2 5
3 6
#include <array>
#include <iostream>
int main() {
std::array<std::array<int, 3>, 2> matrix{{{{1, 2, 3}}, {{4, 5, 6}}}};
// Visit columns first to print the transposed shape.
for (size_t column = 0; column < 3; ++column) { for (size_t row = 0; row < 2; ++row) std::cout << (row ? " " : "") << matrix[row][column]; std::cout << '\n'; }
}
1 4
2 5
3 6
So sánh C và C++
Thay vì tạo ma trận mới, chương trình đổi thứ tự hai vòng lặp: vòng ngoài duyệt theo cột, vòng trong duyệt theo hàng. Vì vậy mỗi cột của ma trận gốc được in ra thành một hàng, cho kết quả 1 4, 2 5 và 3 6.
C dùng các hàm thủ tục gọn nhẹ và thể hiện rõ cách dữ liệu được biểu diễn trong bộ nhớ.
C++ vẫn cho phép làm việc ở mức thấp nhưng bổ sung các kiểu dữ liệu thư viện và công cụ trừu tượng an toàn hơn.
Bài tập mở rộng
Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.
- Thử nhập dữ liệu sai và các giá trị ở biên.
- Biên dịch với các cờ -Wall -Wextra -Wpedantic để bật thêm cảnh báo.
- Tách phần khai báo dùng chung ra file header và phần cài đặt ra file riêng.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
- Row Sums Add up every row of a grid. Dễ
- Nhân ma trận Nhân hai ma trận, phép tính đứng sau mọi lớp của mạng nơ-ron. Dễ