[Bài 38] Ma Trận Và Mảng 2 Chiều

[Bài 38] Ma Trận Và Mảng 2 Chiều

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 <iostream>
#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 : 

Cac so nguyen to tren duong cheo chinh : 3 5 11

 

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 <iostream>
#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 : 

Cac so nguyen to tren duong cheo phu : 7 17

 

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 <iostream>
#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 : 

Tong cac so trong tam giac duoi : 57

 

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 <iostream>
#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 : 

Tong cac so trong tam giac tren : 45

 

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 <iostream>
#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 :  

Ma tran chuyen vi :
1 5 9
2 6 10
3 7 11
4 8 12 

Lập trình C++ cơ bản