Menu
CoddyTech

Các phép toán ma trận thường gặp

Thuộc phần Logic và luồng chương trình trong hành trình C# của Coddy. Bài học 6 trên 66.

Ma trận thường được dùng trong toán học và khoa học máy tính. Hãy cùng tìm hiểu một số phép toán phổ biến trên mảng 2D.

Cộng hai ma trận với nhau:

int[][] AddMatrices(int[][] a, int[][] b)
{
    int rows = a.Length;
    int[][] result = new int[rows][];
    
    for (int i = 0; i < rows; i++)
    {
        result[i] = new int[a[i].Length];
        for (int j = 0; j < a[i].Length; j++)
        {
            result[i][j] = a[i][j] + b[i][j];
        }
    }
    return result;
}

Chuyển vị ma trận (hoán đổi hàng và cột):

int[][] Transpose(int[][] matrix)
{
    int rows = matrix.Length;
    int cols = matrix[0].Length;
    
    int[][] result = new int[cols][];
    for (int i = 0; i < cols; i++)
    {
        result[i] = new int[rows];
        for (int j = 0; j < rows; j++)
        {
            result[i][j] = matrix[j][i];
        }
    }
    return result;
}

Tính tổng của từng hàng:

int[] RowSums(int[][] matrix)
{
    int rows = matrix.Length;
    int[] sums = new int[rows];
    
    for (int i = 0; i < rows; i++)
    {
        int sum = 0;
        for (int j = 0; j < matrix[i].Length; j++)
        {
            sum += matrix[i][j];
        }
        sums[i] = sum;
    }
    return sums;
}

Nhân hai ma trận với nhau:

Trong phép nhân ma trận, mỗi phần tử result[i][j] được tính bằng cách lấy hàng i của ma trận thứ nhất và cột j của ma trận thứ hai, nhân các phần tử tương ứng với nhau rồi tính tổng các tích. Cụ thể: result[i][j] = sum of matrix1[i][k] * matrix2[k][j] với mọi giá trị hợp lệ của k.
Để phép tính này thực hiện được, số cột trong matrix1 phải bằng số hàng trong matrix2. Ma trận kết quả có kích thước [matrix1.rows × matrix2.cols].

int[][] MultiplyMatrices(int[][] a, int[][] b)
{
    int rows = a.Length;
    int cols = b[0].Length;
    int inner = b.Length;
    
    int[][] result = new int[rows][];
    for (int i = 0; i < rows; i++)
    {
        result[i] = new int[cols];
        for (int j = 0; j < cols; j++)
        {
            int sum = 0;
            for (int k = 0; k < inner; k++)
            {
                sum += a[i][k] * b[k][j];
            }
            result[i][j] = sum;
        }
    }
    return result;
}
challenge icon

Thử thách

Khó

Tạo một phương thức có tên multiplyMatrices để:

  1. Nhận hai ma trận (mảng răng cưa 2D) làm tham số: matrix1 và matrix2
  2. Nhân chúng theo quy tắc nhân ma trận
  3. Trả về ma trận kết quả

Để phép nhân ma trận hợp lệ:

  • Số cột của matrix1 phải bằng số hàng của matrix2
  • Kích thước của kết quả là: [matrix1.rows × matrix2.columns]

Cách phép nhân ma trận hoạt động:
Mỗi phần tử tại vị trí [i][j] trong kết quả được tính bằng cách lấy hàng i của matrix1 và cột j của matrix2, nhân các phần tử tương ứng với nhau rồi tính tổng tất cả tích đó:

result[i][j] = matrix1[i][0] * matrix2[0][j] + matrix1[i][1] * matrix2[1][j] + ...

Nói cách khác: result[i][j] = sum of (matrix1[i][k] * matrix2[k][j]) với mỗi k.

Ví dụ, nếu matrix1 là:

[1, 2]
[3, 4]

Và matrix2 là:

[5, 6]
[7, 8]

Khi đó result[0][0] = 1*5 + 2*7 = 19, result[0][1] = 1*6 + 2*8 = 22, v.v. Kết quả phải là:

[19, 22]
[43, 50]

Nếu không thể nhân hai ma trận, hãy trả về null.

Tự làm thử

public class MultiplyMatrices
{
    // Triển khai phương thức (method) MultiplyMatrices
    public static int[][] multiplyMatrices(int[][] matrix1, int[][] matrix2)
    {
        // Viết code ở đây
        
    }
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch C# online