Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Nhân ma trận và Chuẩn hóa ma trận (Matrix Multiplication and Normalization) trong C


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