Mảng 2 chiều thường được sử dụng để lưu trữ dữ liệu cho các bài toán liên quan tới ma trận, trong bài viết này mình nhắc lại những khái niệm quan trọng với ma trận.
1. Ma Trận
Ma trận là một khái niệm quan trọng trong môn học đại số tuyến tính nhưng nếu bạn chưa học đại số tuyến tính thì cũng không có vấn đề gì khó khăn khi tiếp cận với ma trận.
Ma trận là một bảng số gồm các hàng và các cột, ví dụ ma trận A có n hàng và m cột thì sẽ được ký hiệu : Anxm
Do đó khi cần lưu trữ ma trận trong lập trình C++ thì bạn chỉ cần sử dụng một mảng 2 chiều
Ma trận có số hàng và số cột bằng nhau gọi là ma trận vuông.
2. Đường Chéo Chính, Phụ
Trong ma trận vuông thì đường chéo chính chứa những phần tử có chỉ số hàng và cột bằng nhau
Ví dụ 1 : Liệt kê các số nguyên tố trên đường chéo chính
#include <math.h>
#include <algorithm>
using namespace std;
bool nt(int n) {
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return false;
}
return n > 1;
}
int main() {
int n = 4;
// hang va cot deu la 4
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 7, 4, 1}, {10, 2, 0, 11} };
cout << "Cac so nguyen to tren duong cheo chinh : ";
for (int i = 0; i < n; i++) {
if (nt(a[i][i])) {
cout << a[i][i] << " ";
}
}
return 0;
}
Output :
Trong ma trận vuông thì đường chéo phụ chứa các phần tử như hình dưới
Ví dụ 2 : Liệt kê các số nguyên tố trên đường chéo phụ
#include <math.h>
#include <algorithm>
using namespace std;
bool nt(int n) {
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return false;
}
return n > 1;
}
int main() {
int n = 4;
// hang va cot deu la 4
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 17, 4, 1}, {10, 2, 0, 11} };
cout << "Cac so nguyen to tren duong cheo phu : ";
for (int i = 0; i < n; i++) {
if (nt(a[i][n - i - 1])) {
cout << a[i][n - i - 1] << " ";
}
}
return 0;
}
Output :
3. Tam Giác Trên, Dưới
Tam giác dưới chứa các phần tử từ đường chéo chính đổ xuống, các phần tử màu vàng trong hình dưới
Ví dụ 1 : Tính tổng các phần tử trong tam giác dưới
#include <math.h>
#include <algorithm>
using namespace std;
int main() {
int n = 4;
// hang va cot deu la 4
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 17, 4, 1}, {10, 2, 0, 11} };
int tong = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
tong += a[i][j];
}
}
cout << "Tong cac so trong tam giac duoi : " << tong << endl;
return 0;
}
Output :
Tam giác trên chứa các phần tử từ đường chéo chính đổ lên, các phần tử màu vàng trong hình dưới
Ví dụ 2 : Tính tổng các phần tử trong tam giác trên
#include <math.h>
#include <algorithm>
using namespace std;
int main() {
int n = 4;
// hang va cot deu la 4
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 17, 4, 1}, {10, 2, 0, 11} };
int tong = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
tong += a[i][j];
}
}
cout << "Tong cac so trong tam giac tren : " << tong << endl;
return 0;
}
Output :
4. Ma Trận Chuyển Vị
Ma trận chuyển vị của ma trận A có n hàng và m cột là ma trận AT có m hàng và n cột, trong đó các phần tử ở hàng của ma trận A sẽ thành cột của của ma trận AT
Ví dụ : In ra ma trận chuyển vị của ma trận A
#include <math.h>
#include <algorithm>
using namespace std;
int main() {
int n = 3, m = 4;
int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
int b[4][3];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
b[i][j] = a[j][i];
}
}
cout << "Ma tran chuyen vi : \n";
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << b[i][j] << " ";
}
cout << endl;
}
return 0;
}
Output :
1 5 9
2 6 10
3 7 11
4 8 12