Khái niệm ma trận chuyển vị
Ma trận chuyển vị của ma trận A (ký hiệu AT) là ma trận có hàng bằng cột của A và cột bằng hàng của A. Phần tử tại vị trí (i,j) của A sẽ chuyển sang vị trí (j,i) của AT.
Ví dụ: Ma trận 2×3 → Chuyển vị thành 3×2
Ma trận gốc: Ma trận chuyển vị:
1 2 3 1 4
4 5 6 2 5
3 6
Logic cốt lõi
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
transpose[j][i] = matrix[i][j];
}
}
Chương trình 1: Sử dụng mảng tĩnh (kích thước cố định)
#include <stdio.h>
int main() {
int m, n, i, j;
int matrix[10][10], transpose[10][10];
printf("Nhap so hang va cot: ");
scanf("%d %d", &m, &n);
printf("Nhap cac phan tu ma tran:\n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
// Tính chuyển vị
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
transpose[j][i] = matrix[i][j];
}
}
// In kết quả (kích thước n x m)
printf("Ma tran chuyen vi:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
printf("%d\t", transpose[i][j]);
}
printf("\n");
}
return 0;
}
Kết quả chạy chương trình 1
Nhap so hang va cot: 2 3
Nhap cac phan tu ma tran:
1 2 3
4 5 6
Ma tran chuyen vi:
1 4
2 5
3 6
Chương trình 2: Sử dụng #define cho kích thước cố định
#include <stdio.h>
#define ROW 2
#define COL 5
int main() {
int i, j;
int mat[ROW][COL], trans[COL][ROW];
printf("Nhap ma tran %dx%d:\n", ROW, COL);
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
scanf("%d", &mat[i][j]);
}
}
// Tạo ma trận chuyển vị
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
trans[j][i] = mat[i][j];
}
}
printf("\nMa tran chuyen vi (%dx%d):\n", COL, ROW);
for (i = 0; i < COL; i++) {
for (j = 0; j < ROW; j++) {
printf("%d ", trans[i][j]);
}
printf("\n");
}
return 0;
}
Kết quả chạy chương trình 2
Nhap ma tran 2x5:
1 2 3 4 5
5 4 3 2 1
Ma tran chuyen vi (5x2):
1 5
2 4
3 3
4 2
5 1
Lưu ý quan trọng
- Kích thước ma trận chuyển vị là n × m (đảo ngược m × n)
- Chỉ số hàng và cột được hoán đổi:
transpose[j][i] = matrix[i][j] - Khi in, vòng lặp ngoài chạy tới
n(số cột gốc), vòng lặp trong chạy tớim(số hàng gốc)