Trong đại số tuyến tính, ma trận M[][] là đối xứng (symmetric) khi và chỉ khi ma trận chuyển vị bằng chính nó. Chuyển vị là lật qua đường chéo chính, hàng thành cột.
Ví dụ ma trận đối xứng:
[1 4 7] [1 4 7] [4 5 6] = [4 5 6] [7 6 9] [7 6 9]
Ví dụ
Input: {{1,2,3},{2,2,4},{3,4,1}} → đối xứng
Input: {{1,7,3},{2,9,5},{4,6,8}} → không đối xứng
Cách làm
- Tính ma trận chuyển vị lưu vào ma trận khác
- So sánh ma trận kết quả với ma trận gốc
Thuật toán
BẮT ĐẦU
#define n 10
Hàm chuyenVi(int a[][n], int b[][n], int k)
Với i,j từ 0 đến k-1: b[i][j] = a[j][i]
Hàm kiemTra(int a[][n], int k)
Tạo ma trận b[k][n]
Gọi chuyenVi(a,b,k)
So sánh a[i][j] với b[i][j], nếu khác trả về false
Trả về true
main()
a = {{1,2,3},{2,2,4},{3,4,1}}
Nếu kiemTra(a,3) in "đối xứng" ngược lại "không đối xứng"
KẾT THÚC
Ví dụ mã C++
#include <iostream>
#define n 10
using namespace std;
void chuyenVi(int a[][n], int b[][n], int k){
for (int i = 0; i < k; i++)
for (int j = 0; j < k; j++)
b[i][j] = a[j][i];
}
bool kiemTra(int a[][n], int k){
int b[k][n];
chuyenVi(a, b, k);
for (int i = 0; i < k; i++)
for (int j = 0; j < k; j++)
if (a[i][j] != b[i][j])
return false;
return true;
}
int main(){
int a[][n] = {{1,2,3},{2,2,4},{3,4,1}};
if (kiemTra(a, 3))
cout << "là ma trận đối xứng";
else
cout << "không phải ma trận đối xứng";
return 0;
}
Kết quả đầu ra
là ma trận đối xứng