Menu
Coddy logo textTech

Common Matrix Operations

Часть раздела Логика и управление потоком путешествия по C# на Coddy — урок 6 из 66.

Матрицы широко используются в математике и информатике. Давайте рассмотрим некоторые распространённые операции над двумерными массивами.

Сложить две матрицы:

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;
}

Транспонировать матрицу (поменять местами строки и столбцы):

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;
}

Вычислите сумму каждой строки:

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;
}

Умножение двух матриц:


В умножении матриц каждый элемент result[i][j] вычисляется как скалярное произведение строки i из первой матрицы и столбца j из второй матрицы — то есть сумма matrix1[i][k] * matrix2[k][j] для каждого k. Первая матрица должна иметь столько же столбцов, сколько строк имеет вторая матрица.

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

Задание

Сложно

Создайте метод с названием multiplyMatrices, который:

  1. Принимает две матрицы (2D jagged arrays) в качестве параметров: matrix1 и matrix2
  2. Умножает их в соответствии с правилами умножения матриц
  3. Возвращает результирующую матрицу

Для допустимости умножения матриц:

  • Количество столбцов в matrix1 должно равняться количеству строк в matrix2
  • Результат будет иметь размеры: [matrix1.rows × matrix2.columns]

Как работает умножение матриц:
Каждый элемент в позиции [i][j] в результате вычисляется путём взятия строки i из matrix1 и столбца j из matrix2, умножения соответствующих элементов друг с другом и суммирования всех этих произведений:

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

Иными словами: result[i][j] = sum of (matrix1[i][k] * matrix2[k][j]) для каждого k.

Например, если matrix1:

[1, 2]
[3, 4]

А matrix2:

[5, 6]
[7, 8]

Тогда result[0][0] = 1*5 + 2*7 = 19, result[0][1] = 1*6 + 2*8 = 22 и так далее. Результат должен быть:

[19, 22]
[43, 50]

Если матрицы нельзя умножить, верните null.

Шпаргалка

Распространённые операции с матрицами с использованием 2D рваными массивов:

Сложить две матрицы:

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;
}

Транспонировать матрицу (поменять местами строки и столбцы):

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;
}

Вычислить сумму каждой строки:

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;
}

Умножить две матрицы:
Каждый элемент result[i][j] является суммой произведений строки i из первой матрицы и столбца j из второй матрицы:
result[i][j] += matrix1[i][k] * matrix2[k][j] для каждого k.
Первая матрица должна иметь столько же столбцов, сколько строк во второй матрице.

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++)
        {
            for (int k = 0; k < inner; k++)
            {
                result[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    return result;
}

Попробуйте сами

public class MultiplyMatrices
{
    // Реализуйте метод MultiplyMatrices
    public static int[][] multiplyMatrices(int[][] matrix1, int[][] matrix2)
    {
        // Напишите свой код здесь
        
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком