Nhân ma trận (Matrix Multiplication)
Nhân ma trận chỉ thực hiện được khi thỏa mãn điều kiện: ma trận P (a×b) và Q (z×y) có thể nhân nếu b = z. Ma trận kết quả R có kích thước (a×y).
Thuật toán nhân ma trận
matrixMultiply(P, Q):
Giả sử P (a×b), Q (z×y)
Nếu b != z thì thoát
Khởi tạo R (a×y)
Với i từ 0 đến a-1:
Với j từ 0 đến y-1:
Với k từ 0 đến z-1:
R[i,j] += P[i,k] * Q[k,j]
Chuẩn hóa ma trận (Matrix Normalization)
Ví dụ ma trận 2×3:
4 5 6 1 2 3
Ma trận chuẩn hóa (theo hàng): mỗi phần tử chia cho căn bậc hai tổng bình phương các phần tử khác trong cùng hàng.
Hàng 0: 4/√(5²+6²) 5/√(5²+6²) 6/√(5²+6²) Hàng 1: 1/√(2²+3²) 2/√(2²+3²) 3/√(2²+3²)
Ví dụ mã nguồn
#include <stdio.h>
#include <math.h>
int main() {
int row, col, row1, col1;
int matrix[50][50];
long long square[50] = {0};
double norm[50][50], k;
printf("Nhap kich thuoc ma tran (hang cot): ");
scanf("%d %d", &row, &col);
printf("Nhap ma tran %dx%d:\n", row, col);
for (row1 = 0; row1 < row; row1++)
for (col1 = 0; col1 < col; col1++)
scanf("%d", &matrix[row1][col1]);
printf("\nMa tran vua nhap:\n");
for (row1 = 0; row1 < row; row1++) {
for (col1 = 0; col1 < col; col1++)
printf("%d ", matrix[row1][col1]);
printf("\n");
}
// Tính tổng bình phương mỗi hàng (bỏ cột 0)
for (row1 = 0; row1 < row; row1++) {
for (col1 = 1; col1 < col; col1++) {
long long a = matrix[row1][col1];
square[row1] += a * a;
}
printf("Tong binh phuong hang %d: %lld\n", row1, square[row1]);
}
// Chuẩn hóa
for (row1 = 0; row1 < row; row1++) {
k = 1.0 / sqrt(square[row1]);
for (col1 = 0; col1 < col; col1++)
norm[row1][col1] = k * matrix[row1][col1];
}
printf("\nMa tran chuan hoa (Normalized Matrix):\n");
for (row1 = 0; row1 < row; row1++) {
for (col1 = 0; col1 < col; col1++)
printf("%.3lf ", norm[row1][col1]);
printf("\n");
}
return 0;
}
Kết quả đầu ra
Nhap kich thuoc ma tran 2 3 Nhap ma tran 2x3 4 5 6 1 2 3 Ma tran vua nhap: 4 5 6 1 2 3 Tong binh phuong hang 0: 61 Tong binh phuong hang 1: 13 Ma tran chuan hoa: 0.512 0.640 0.768 0.277 0.555 0.832